一. Hibernate介绍
1. Hibernate简介
Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层开发,操作数据库。还可以使用Hibernate提供的HQL(Hibernate Query Language)直接从数据库中获得Java对象。
2. Hibernate工作原理
Hibernate开发过程中会用到5个核心接口,分别为:Configuration接口,SessionFactory接口,Session接口,Transaction接口和用于数据查询的Query接口。通过这些接口,可以对持久化对象进行操作,还可以进行事物控制。
这里先介绍一下Hibernate进行持久化操作的主要步骤:
(1)Hibernate的初始化,创建Configuration对象。
这一步用来读取XML配置文件和映射文件的信息到Configuration对象的属性中。具体为:
① 从Hibernate配置文件Hibernate.cfg.xml中读取配置信息,存放到Configuration对象中。
②根据配置文件中的mapping元素加载所有实体类对应的映射文件到Configuration对象中。
(2)创建SessionFactory实例。
通过Configuration对象读取到的配置文件信息创建SessionFactory,即将Configuration对象内的配置信息存入SessionFactory的内存(属性)中。 SessionFactory充当数据存储源的代理,并负责创建Session对象。得到SessionFactory对象后,Configuration对象的使命就结束了。
(3)创建Session实例,建立数据库连接。
Session通过SessionFactory打开,创建一个Session对象就相当于与数据库建立了一个新的连接。Session对象用来操作实体对象,并把这些操作转换成数 据库中数据的增删改查。
(4)创建Transaction实例,开始一个事物。
Transaction用于事物管理,一个Transaction对象对应的事物可以包括多个操作。在使用Hibernate进行增删改是必须先创建Transaction对象。
(5)利用Session的方法进行持久化操作。将实体对象持久化到数据库中。
(6)提交操作结果并结束事物。对实体对象的持久化操作结束后,必须提交事务。
(7)关闭Session,与数据库断开连接。
二. Hibernate开发准备
1. 下载Hibernate开发包
(1)登录站点http://www.hibernate.org进行下载
(2)下载后对压缩包解压,解压后的文件夹下包含Hibernate5.jar,他是Hibernate中最主要的jar包,包含了Hibernate的核心类库文件。
2. 在eclipse中部署Hibernate开发环境
这里就讲一下Hibernate Tools的在线安装方式。注:手动安装的时候一定要注意Hibernate Tools与Eclipse版本的兼容性,否则会导致插件安装失败。
(1)运行eclipse,选择主菜单Help|Install New Software选项,弹出Install对话框。
(2)单价Add按钮,弹出Add Repository对话框。其中Name文本框中输入插件名,名字任意。Location文本框中输入下载地址http://download.jboss.org/jbosstools/updates/stable/indigo/ ,单击OK按钮。
(3)根据需要选择相关功能,此处勾选Abridged JBoss Tools 3.3下面的Hibernate Tool选项,单击Next,并接受协议,开始安装,安装完毕根据提示重启Eclipse。(因为我已经安装了这个插件,所以不再显示,大家安装自己的就好了。)
三. Hibernate开发实例
1. 开发Hibernate项目的完整流程
(1)准备开发环境,创建HibernateDemo项目。
(2)在数据库中创建数据库表。
(3)创建持久化类。
(4)设计映射文件,使用Hibernate映射文件将POJO对象映射到数据库。
(5)创建Hibernate的配置文件Hibernate.cfg.xml。
(6)编写辅助工具类HibernateUtils类,用来实现Hibernate的初始化并提供获得Session的方法,此步可根据情况取舍。
(7)编写DAO层类。
(8)编写Service层类。
(9)编写测试类。
2. 创建HibernateDemo项目
(1)在eclipse中创建Dynamic Web Project的方法创建项目,名称为HibernateDemo。
(2)将Hibernate tools引入项目。在HibernateDemo项目中右击,选择New|Other,选择Hibernate Configuration File(cfg.xml)选项,点击Next,一般使用默认的hibernate.cfg.xml即可。
(3)最后点击finish按钮。至此,HibernateDemo项目创建完成。
3. 创建数据库表user表。
4. 编写POJO映射类User.java。
package org.hibernate.entity; public class User implements java.io.Serializable{ private int id; private String name; private String password; private String type; public User() { } public int getId() { return this.id; } public void setId(int id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public String getType() { return this.type; } public void setType(String type) { this.type = type; } }
5. 编写映射文件User.hbm.xml。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.hibernate.entity.User" table="user"> <id name="id" type="java.lang.Integer" column="user_id"> <generator class="increment"/> </id> <property name="name" type="java.lang.String" column="name" length="20"> </property> <property name="password" type="java.lang.String" column="password" length="12"> </property> <property name="type" type="java.lang.String" column="type" length="6"> </property> </class> </hibernate-mapping>
6. 编写hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name=""> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">1234</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mysqldb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.pool_size">1</property> <property name="show_sql">true</property> <mapping resource="org/hibernate/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
7. 编写辅助工具类HibernateUtil.Java
package org.hibernate.entity; import org.hibernate.*; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; private static Configuration configuration = new Configuration();
//创建线程局部变量threadLocal,用来保存Hibernate的Session private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>(); //使用静态代码块初始化Hibernate
static{ try{ Configuration cfg=new Configuration().configure();//读取配置文件hibernate.cfg.xml sessionFactory=cfg.buildSessionFactory(); //创建SessionFactory }catch(Throwable ex){ throw new ExceptionInInitializerError(ex); } } //获得SessionFactory实例 public static SessionFactory getSessionFactory(){ return sessionFactory; }
//获得ThreadLocal对象管理的Session实例 public static Session getSession() throws HibernateException{ Session session=(Session) threadLocal.get(); if(session==null||!session.isOpen()){ if(sessionFactory==null){ rebuildSessionFactory(); }
// 通过SessionFactory对象创建Session对象 session=(sessionFactory!=null)?sessionFactory.openSession():null; threadLocal.set(session); //将新打开的Session实例保存到线程局部变量threadLocal中 } return session; } //关闭Session实例 public static void closeSession() throws HibernateException{ Session session=(Session) threadLocal.get(); //从线程局部变量threadLocal中获取之前存入的Session实例 threadLocal.set(null); if(session!=null){ session.close(); } } //重建SessionFactory public static void rebuildSessionFactory(){ try{ configuration.configure("/hibernate.cfg.xml"); sessionFactory=configuration.buildSessionFactory(); }catch(Exception e){ System.err.println("Error creating SessionFactory"); e.printStackTrace(); } } //关闭缓存和连接池 public static void shutdown(){ getSessionFactory().close(); } }
8. 编写一个用于数据库访问的DAO接口UserDAO.java
//创建UserDAO接口 public interface UserDAO{ void save(User user); //添加用户 User findById(int id); //根据用户标示查找指定用户 void delete(User user);//删除用户 void update(User user);//修改用户信息 }
9. 编写DAO层实现类UserDAOImpl.java
package org.hibernate.dao; import org.hibernate.*; import org.hibernate.entity.*; public class UserDAOImpl implements UserDao{ @Override public void save(User user) { // TODO Auto-generated method stub Session session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); try{ session.save(user); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); } } @Override public User findById(int id) { // TODO Auto-generated method stub User user=null; Session session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); try{ user=(User)session.get(User.class, id); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtil.closeSession(); } return user; } @Override public void delete(User user) { // TODO Auto-generated method stub Session session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); try{ session.delete(user); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtil.closeSession(); } } @Override public void update(User user) { // TODO Auto-generated method stub Session session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); try{ session.update(user); tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ HibernateUtil.closeSession(); } } }
10. Junit是一种进行单元测试的常用方法,这里我们简单介绍一下Eclipse中JUnit4的用法,我们以save方法为例,对save方法完成测试:
(1)建立测试用例。
Properties-》Java Build Path-》Add Library...最后在Add Library对话框中选中Junit单击Next按钮。
(2)在使用JUnit4测试时,不需要main方法,可以直接用IDE进行测试。创建一个org.hibernate.test包,右击包,选择New-》JUnit Test Case,弹窗New JUnit Test Case窗口。
配置完成,则会出现UserTest方法,将UserTest类补充完成即可。
package org.hibernate.test; import static org.junit.Assert.*; import org.hibernate.dao.DAOFactory; import org.hibernate.dao.UserDAOImpl; import org.hibernate.dao.UserDao; import org.hibernate.entity.User; import org.junit.Before; import org.junit.Test; //测试用例 public class UserTest { @Before //注解表明setUp方法为初始化方法 public void setUp() throws Exception { } @Test //测试save方法 public void testSave() { UserDao userdao=DAOFactory.getUserDAOInstance(); //UserDao userdao=new UserDAOImpl(); try{ User u=new User(); //创建User对象 u.setId(20); u.setName("zhangsan"); u.setPassword("4567"); u.setType("admin"); userdao.save(u); //使用UserDAOImpl的save方法将User对象存入数据库 }catch(Exception e){ e.printStackTrace(); } } }
(3)在UserTest.java节点上单击右键,Run As-》JUnit Test测试。
自此,查看数据库,数据插入到数据库中,测试成功!!!!!!