目录
1、Hibernate执行流程分析及配置文件详解
1)Configuration对象
2)ServiceRegistry对象(hibernate4的新特性)
3)SessionFactory对象
4)Session对象
5)Transaction对象
6)hibernate.cfg.xml配置详解
7)Student.hbm.xml配置详解
2、抽取HibernateUtils工具类
3、Session的常用方法详解(CRUD案例)
1、Hibernate执行流程分析及配置文件详解
Hibernate核心的API详解:
1)Configuration对象
Configuration类负责管理Hibernate的配置信息。包括如下内容: 1)Hibernate运行的底层信息: 数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。 2)持久化类与数据表的映射关系(*.hbm.xml 文件) 创建Configuration 的两种方式: 属性文件(hibernate.properties): Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)(推荐使用) Configuration cfg = new Configuration().configure(); |
2)ServiceRegistry对象(hibernate4的新特性)
ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制. |
3)SessionFactory对象
1)Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。 Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); 2)SessionFactory是线程安全的。 3)SessionFactory是生成Session的工厂: Session session = sf.openSession(); 4)构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象 |
4)Session对象
1)Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。 2)持久化类与 Session 关联起来后就具有了持久化的能力。 3)是线程不安全的 4)Session 类的方法: 取得持久化对象的方法: get() load() 持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete() 开启事务: beginTransaction(). 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等 |
5)Transaction对象
1)代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。 Transaction tx = session.beginTransaction(); 2)常用方法: commit():提交相关联的session实例 rollback():撤销事务操作 |
6)hibernate.cfg.xml配置详解
<hibernate-configuration> <session-factory> <!-- 数据库连接配置 --> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/day14?useUnicode=true&characterEncoding=utf-8 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 数据库方言 --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property> <!-- 显示执行的sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql语句 --> <property name="hibernate.format_sql">true</property> <!-- hibernate自动维护表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 对象关系映射的配置 --> <mapping resource="gz/itcast/entity/Student.hbm.xml" /> </session-factory> </hibernate-configuration> |
7)Student.hbm.xml配置详解
2、抽取HibernateUtils工具类
public class HibernateUtils { private static SessionFactory sessionFactory = null;
static{ Configuration config = new Configuration().configure(); StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(config.getProperties()) .build(); sessionFactory = config.buildSessionFactory(serviceRegistry); }
public static Session getSession(){ return sessionFactory.openSession(); } } |
3、Session的常用方法详解(CRUD案例)
//演示CURD public class Demo { //添加 @Test public void testInsert(){ Session session = HibernateUtils.getSession(); Transaction tx = null; try{ tx = session.beginTransaction(); Student s = new Student(); s.setId(3); s.setName("王五"); s.setGender("男"); s.setAge(18);
session.save(s);
tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ session.close(); } } //更新 @Test public void testUpdate(){ Session session = HibernateUtils.getSession(); Transaction tx = null; try{ tx = session.beginTransaction();
Student s = new Student(); s.setId(3); s.setName("陈六"); s.setGender("女"); s.setAge(28);
session.update(s);
tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ session.close(); } } //删除 @Test public void testDelete(){ Session session = HibernateUtils.getSession(); Transaction tx = null; try{ tx = session.beginTransaction();
Student s = new Student(); s.setId(3);
session.delete(s);
tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ session.close(); } } //查询 @Test public void testQuery(){ Session session = HibernateUtils.getSession(); Transaction tx = null; try{ tx = session.beginTransaction();
Student s = (Student)session.get(Student.class, 2); System.out.println(s);
tx.commit(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ session.close(); } } } |