在上一篇文章Hibernate4框架快速搭建我们书写Hibernate的测试类是不是很麻烦?加载配置文件,注册登记拿session工厂之类的,所以为了简化我们的开发,我们写一个HibernateUtil工具类:
Hibernate工具类:
package com.tao.util; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); //加载核心配置文件 获取session工厂 private static SessionFactory buildSessionFactory(){ //加载Hibernate核心配置文件 Configuration configure = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configure.getProperties()).build(); SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry); return sessionFactory; } // public static SessionFactory getSessionFactory(){ return sessionFactory; } }
在需要 SessionFactory 的地方 直接调用 HibernateUtil.getSessionFactory() 方法就可以了。
关于Hibernate XML配置版的增删改查我就不过多描述,基本要做的事就是:写好自己的实体bean、配置好实体bean对应的 *.hbm.xml 映射配置文件,最后别忘了在 hibernate.cfg.xml 核心文件中引入就好了。下面来一套最简单的Hibernate XML版 CRUD供参考:
实体bean:Student.java
package com.tao.entity; public class Student { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; }
对应的映射文件:Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tao.entity"> <class name="Student" table="t_student"> <id name="id" column="stu_id"> <generator class="native" /> </id> <property name="name" column="stu_name" length="50" /> </class> </hibernate-mapping>
在 hibernate.cfg.xml 引入 Student.hbm.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Hibernate 核心配置文件 --> <hibernate-configuration> <session-factory> <!-- 配置关于数据库连接的四个项:driverClass url username password --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL --> <property name="show_sql">true</property> <!-- 自动更新表结构 --> <property name="hbm2ddl.auto">update</property> <!-- 引入的映射文件 --> <mapping resource="com\tao\entity\Student.hbm.xml"/> <mapping class="com.tao.entity.Teacher"/> </session-factory> </hibernate-configuration>
单元测试类:TestStudent:
package com.tao.test; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.Test; import com.tao.entity.Student; import com.tao.util.HibernateUtil; public class TestStudent { SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); @Test public void add() { Session session = sessionFactory.openSession(); session.beginTransaction(); Student stu = new Student(); stu.setName("李四"); session.save(stu); session.getTransaction().commit(); session.close(); } @Test public void delete() { Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = (Student)session.get(Student.class, Long.valueOf(2)); session.delete(student); session.getTransaction().commit(); session.close(); } @Test public void update() { Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = (Student)session.get(Student.class, Long.valueOf(1)); student.setName("张三"); session.save(student); session.getTransaction().commit(); session.close(); } @Test public void queryStudent(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Student student1 = (Student) session.get(Student.class, Long.valueOf(1)); Student student2 = (Student) session.get(Student.class, Long.valueOf(2)); //利用对象标识符OID来区分对象 student3实质是从缓存中查出来的 没有访问数据库 Student student3 = (Student) session.get(Student.class, Long.valueOf(1)); System.out.println(student1==student2); System.out.println(student1==student3); session.getTransaction().commit(); session.close(); } @Test public void queryAll() { Session session = sessionFactory.openSession(); session.beginTransaction(); String hql = "from Student"; Query query = session.createQuery(hql); List<Student> list = query.list(); for(Student stu:list){ System.out.println(stu); } session.getTransaction().commit(); session.close(); } }
Hibernate 基于注解版的 CRUD:
实体类:Teacher.java
package com.tao.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name="t_teacher") public class Teacher { private Long id; private String name; @Id @GenericGenerator(name="_native",strategy="native") //自定义主键生成策略 @GeneratedValue(generator="_native")//JPA通用策略生成器 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + "]"; } }
基于注解就不用写实体映射文件了,会根据注解去实体化bean,定义表进行嵌入。
但是也需要在hibernate核心配置文件:hibernate.cfg.xml 进行该资源的引用,否则会报错"无法识别entity"
<mapping class="com.tao.entity.Teacher"/>
测试类:TestTeacher:
package com.tao.test; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.Test; import com.tao.entity.Teacher; import com.tao.util.HibernateUtil; public class TestTeacher { SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); @Test public void add() { Session session = sessionFactory.openSession(); session.beginTransaction(); Teacher teacher = new Teacher(); teacher.setName("李四"); session.save(teacher); session.getTransaction().commit(); session.close(); } @Test public void delete() { Session session = sessionFactory.openSession(); session.beginTransaction(); Teacher Teacher = (Teacher)session.get(Teacher.class, Long.valueOf(2)); session.delete(Teacher); session.getTransaction().commit(); session.close(); } @Test public void update() { Session session = sessionFactory.openSession(); session.beginTransaction(); Teacher Teacher = (Teacher)session.get(Teacher.class, Long.valueOf(1)); Teacher.setName("张三"); session.save(Teacher); session.getTransaction().commit(); session.close(); } @Test public void queryAll() { Session session = sessionFactory.openSession(); session.beginTransaction(); String hql = "from Teacher"; Query query = session.createQuery(hql); List<Teacher> list = query.list(); for(Teacher teacher:list){ System.out.println(teacher); } session.getTransaction().commit(); session.close(); } }
可以达到与XML配制一样的效果 而且简单。