Hibernate02-简单的注解操作
Hibernate    2017-11-15 03:35:27    270    0    0
acme   Hibernate

前面是用xml配置文档进行操作的,这一章开始使用注解来进行简单的CRUD操作。

由于是简单的操作,我们便将上一章的项目复制一份,将名称更改为Hibernate02。

1.首先是开发环境,使用Maven版本为3.5,jdk版本为9.0.1,Hibernate版本为5.0.1Final,数据库为MySQL5.7.20

2.配置Maven的pom.xml文件,由于我当前的jdk版本以及Hibernate版本所以依赖如配置文件中所列出。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.  <modelVersion>4.0.0</modelVersion>
  6. <groupId>cc.acme_me.hibernate</groupId>
  7.  <artifactId>Hibernate02</artifactId>
  8.  <version>1.0-SNAPSHOT</version>
  9.  <name>Hibernate01</name>
  10. <dependencies>
  11. <!-- junit -->
  12.  <dependency>
  13.  <groupId>junit</groupId>
  14.  <artifactId>junit</artifactId>
  15.  <version>4.12</version>
  16.  <scope>test</scope>
  17.  </dependency>
  18. <!-- mysql-connector-java -->
  19.  <dependency>
  20.  <groupId>mysql</groupId>
  21.  <artifactId>mysql-connector-java</artifactId>
  22.  <version>6.0.6</version>
  23.  </dependency>
  24. <dependency>
  25.  <groupId>org.hibernate</groupId>
  26.  <artifactId>hibernate-core</artifactId>
  27.  <version>5.2.12.Final</version>
  28.  </dependency>
  29. <dependency>
  30.  <groupId>antlr</groupId>
  31.  <artifactId>antlr</artifactId>
  32.  <version>2.7.7</version>
  33.  </dependency>
  34. <dependency>
  35.  <groupId>com.fasterxml</groupId>
  36.  <artifactId>classmate</artifactId>
  37.  <version>1.3.4</version>
  38.  </dependency>
  39. <dependency>
  40.  <groupId>dom4j</groupId>
  41.  <artifactId>dom4j</artifactId>
  42.  <version>1.6.1</version>
  43.  </dependency>
  44. <dependency>
  45.  <groupId>org.hibernate.common</groupId>
  46.  <artifactId>hibernate-commons-annotations</artifactId>
  47.  <version>5.0.1.Final</version>
  48.  </dependency>
  49. <dependency>
  50.  <groupId>org.jboss.logging</groupId>
  51.  <artifactId>jboss-logging</artifactId>
  52.  <version>3.3.0.Final</version>
  53.  </dependency>
  54. <dependency>
  55.  <groupId>org.hibernate.javax.persistence</groupId>
  56.  <artifactId>hibernate-jpa-2.1-api</artifactId>
  57.  <version>1.0.0.Final</version>
  58.  </dependency>
  59. <dependency>
  60.  <groupId>org.javassist</groupId>
  61.  <artifactId>javassist</artifactId>
  62.  <version>3.20.0-GA</version>
  63.  </dependency>
  64. <dependency>
  65.  <groupId>org.jboss</groupId>
  66.  <artifactId>jandex</artifactId>
  67.  <version>2.0.3.Final</version>
  68.  </dependency>
  69. <dependency>
  70.  <groupId>org.jboss.logging</groupId>
  71.  <artifactId>jboss-logging</artifactId>
  72.  <version>3.3.0.Final</version>
  73.  </dependency>
  74. <dependency>
  75.  <groupId>org.jboss.spec.javax.transaction</groupId>
  76.  <artifactId>jboss-transaction-api_1.2_spec</artifactId>
  77.  <version>1.0.1.Final</version>
  78.  </dependency>
  79. <dependency>
  80.  <groupId>com.sun.xml.bind</groupId>
  81.  <artifactId>jaxb-core</artifactId>
  82.  <version>2.3.0</version>
  83.  </dependency>
  84.  <dependency>
  85.  <groupId>javax.xml.bind</groupId>
  86.  <artifactId>jaxb-api</artifactId>
  87.  <version>2.3.0</version>
  88.  </dependency>
  89.  <dependency>
  90.  <groupId>com.sun.xml.bind</groupId>
  91.  <artifactId>jaxb-impl</artifactId>
  92.  <version>2.3.0</version>
  93.  </dependency>
  94.  <dependency>
  95.  <groupId>javax.activation</groupId>
  96.  <artifactId>activation</artifactId>
  97.  <version>1.1.1</version>
  98.  </dependency>
  99.  </dependencies>
  100. </project>​

 3.Hibernate的全局配置文件hibernate.cfg.xml,同时由于使用注解,所以就不需要使用hbm.xml这个配置文件了。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6.  <session-factory>
  7.  <!--数据库连接设置-->
  8.  <property name="connection.username">root</property>
  9.  <property name="connection.password">root</property>
  10.  <property name="connection.url">jdbc:mysql://localhost:3306/db_hibernate</property>
  11.  <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
  12.  <!--数据库方言-->
  13.  <property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
  14.  <!--显示sql语句-->
  15.  <property name="show_sql">true</property>
  16.  <!--格式化sql语句-->
  17.  <property name="format_sql">true</property>
  18.  <!--设置ddl 根据设置自动更新表结构 包括添加删除表 更新表结构-->
  19.  <property name="hbm2ddl.auto">create-drop</property>
  20.  <!--告诉Hibernate映射的实体类-->
  21.  <mapping class="cc.acme_me.model.Student"/>
  22.  </session-factory>
  23. </hibernate-configuration>​

4.实体类Student,字段的注解也可以放在getter方法上。

  1. package cc.acme_me.model;
  2. import org.hibernate.annotations.GenericGenerator;
  3. import javax.persistence.*;
  4. @Table(name = "t_student")//对应的表,name属性可选,用于定义表名,不写默认类名
  5. @Entity//映射实体
  6. public class Student {
  7. @Id//代表映射主键
  8.  @GenericGenerator(name = "native", strategy = "native")//定义策略然后下面使用
  9.  @GeneratedValue(generator = "native")
  10.  private long id;//作为主键
  11. @Column(name = "studentname")//@Column定义普通字段,name可选
  12.  private String name;//姓名
  13. @Column(name = "studentage")
  14.  private int age;//年龄
  15.  public long getId() {
  16.  return id;
  17.  }
  18. public void setId(long id) {
  19.  this.id = id;
  20.  }
  21. public String getName() {
  22.  return name;
  23.  }
  24. public void setName(String name) {
  25.  this.name = name;
  26.  }
  27. public int getAge() {
  28.  return age;
  29.  }
  30. public void setAge(int age) {
  31.  this.age = age;
  32.  }
  33. @Override
  34.  public String toString() {
  35.  return "Student{" +
  36.  "id=" + id +
  37.  ", name='" + name + '\'' +
  38.  ", age=" + age +
  39.  '}';
  40.  }
  41. }​

5.工具类

  1. package cc.acme_me.utils;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.boot.MetadataSources;
  5. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  6. import org.hibernate.service.ServiceRegistry;
  7. public class SessionUtils {
  8. public static Session openSession() {
  9. ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
  10. SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
  11. return sessionFactory.openSession();
  12. }
  13. }​

6.最后便是测试方法。

  1. package cc.acme_me.test;
  2. import cc.acme_me.model.Student;
  3. import cc.acme_me.utils.SessionUtils;
  4. import org.hibernate.Session;
  5. import org.junit.After;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. public class TestStudent {
  9.  private Session session = null;
  10. @Before//使用该注解可以在测试方法运行前调用,我们可以使用它将获取session的方法写好,就不需要为每一个测试方法写一遍session的获取
  11.  public void openSession() {
  12.  session = SessionUtils.openSession();
  13.  session.beginTransaction();
  14.  }
  15. @After//该注解是在测试方法运行后调用,我们可以在这里设置事物的提交和session的关闭
  16.  public void closeSession() {
  17.  session.getTransaction().commit();
  18.  session.close();
  19.  }
  20. @Test
  21.  public void testAdd() {
  22.  //新建一个实体对象并设置参数
  23.  Student student = new Student();
  24.  student.setAge(18);
  25.  student.setName("Admin");
  26.  //由于我们在主键策略里面使用了自增长策略,所以可以不用配置ID,Hibernate可以为我们自动生成
  27.  //使用save方法将实体对象持久化到数据库中
  28.  session.save(student);
  29.  }
  30. @Test
  31.  public void testFind(){
  32.  Student student = session.get(Student.class,1L);
  33.  System.out.println(student);
  34.  }
  35. @Test
  36.  public void testUpdate(){
  37.  Student student = session.get(Student.class,1L);
  38.  student.setName("Administrator");
  39.  student.setAge(20);
  40.  session.update(student);// session.saveOrUpdate(student); 可以使用这两个方法更新数据,后者相比前者,可以在你不确定是更新还是添加数据的时候交由Hibernate去判断并调用合适的方法
  41.  }
  42. @Test
  43.  public void testDelete(){
  44.  Student student = new Student();
  45.  student.setId(1L);
  46.  session.delete(student);
  47.  //session.delete(session.get(Student.class,1L));
  48.  }
  49. }​

 

Pre: Hibernate03-单向 简单一对多关系映射

Next: Hibernate01-简单的增删改查

270
Table of content