Hibernate的学习路线图
Hibernate API简介
Configuration
Configuration类负责管理Hibernate的配置信息,包括如下内容:
- Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。
- 持久化类与数据表的映射关系(*.hbm.xml文件)。
创建Configuration的两种方式:
- 属性文件(hibernate.properties)
Configuration cfg = new Configuration();
- Xml文件(hibernate.cfg.xml)
- 加载默认名称的配置文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
- 或加载指定名称的配置文件
Configuration cfg = new Configuration().configure(“myhibernate.cfg.xml”);
- 加载默认名称的配置文件(hibernate.cfg.xml)
Configuration类还有如下这些常用方法:
- addResource(String resource):导入一个指定位置的映射文件。
- addClass(Class clazz):导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件。
- buildSessionFactory():创建Session工厂。
SessionFactory
Configuration对象根据当前的配置信息生成SessionFactory对象。SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时SessionFactory还负责维护Hibernate的二级缓存)。相关代码如下:
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
- SessionFactory是线程安全的。
- SessionFactory是生成Session的工厂:
Session session = sessionFactory.openSession();
- 构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。
SessionFactory类还有如下两个方法:
- getCurrentSession(),后面会重点讲解。
- close(),知道就好。
Session
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。(相当于JDBC中的Connection)
- 持久化类与Session关联起来后就具有了持久化的能力。
- Session是线程不安全的。
- Session类的一些方法:
- 取得持久化对象的方法: get()、load()
- 持久化对象都得保存,更新和删除:save(Object)、update(Object)、delete(Object)
- 查询的方法:createQuery(String)、createCriteria(Class)
- 管理事务的方法:beginTransaction()、getTransaction()(获取当前Session中关联的事务对象)
- 管理Session的方法:isOpen()、flush()、clear()、evict()、close()等。
Transaction
- 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction tx = session.beginTransaction();
- 常用方法:
- commit():提交相关联的session实例。
- rollback():撤销事务操作。
- wasCommitted():检查事务是否提交。
Query和Criteria接口
都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。
Query接口有如下常用方法:
- list():查询一个结果集合。
- uniqueResult():查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。
Criteria接口中的方法,我们后面会详解介绍到。
例如,我们要查询数据库中user表中所有的记录,就有2种方式:
- 方式一:使用HQL语句
List<User> list = session.createQuery("FROM User").list(); // 使用HQL查询
- 方式二:使用Criteria查询
Criteria criteria = session.createCriteria(User.class); List<User> list = criteria.list();
若是要查询id为5的用户的信息,同样也有2种方式:
- 方式一:使用HQL语句
List<User> list = session.createQuery("FROM User WHERE id=5").list(); // 使用HQL查询
- 方式二:使用Criteria查询
Criteria criteria = session.createCriteria(User.class); // 增加过滤条件 criteria.add(Restrictions.eq("id", 5)); // id=5的条件 List<User> list = criteria.list();
若是要查询所有用户的信息并且以id列升序排列,同理:
- 方式一:使用HQL语句
List<User> list = session.createQuery("FROM User ORDER BY id").list(); // 使用HQL查询
- 方式二:使用Criteria查询
Criteria criteria = session.createCriteria(User.class); // 增加排序条件 criteria.addOrder(Order.asc("id")); List<User> list = criteria.list();
Hibernate的运行过程
Hibernate的运行过程如下:
- 应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。
- 并用这些信息生成一个SessionFactory对象。
- 然后从SessionFactory对象生成一个Session对象。
- 并用Session对象生成Transaction对象。
- 可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作。
- 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。
用图来表示即为:
Hibernate主配置文件
在Hibernate主配置文件——hibernate.cfg.xml中配置的key前面的hibernate.前缀可以有,也可以没有。如:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
等同于:
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
Hibernate主配置文件(hibernate.cfg.xml)的内容按作用可分为三类:
- 数据库信息,包括数据库的URL、用户名、密码、JDBC驱动类以及数据库Dialect。
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql:///hibernate_20160926</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="hibernate.connection.password">root</property>
- 导入映射文件,如:
<mapping resource="cn/itcast/a_helloworld/User.hbm.xml" />
- 其他配置,有:
- 显示生成的SQL语句:
<property name="hibernate.show_sql">true</property>
- 格式化生成的SQL语句:
<property name="hibernate.format_sql">true</property>
- 自动生成表结构:
<property name="hbm2ddl.auto">create/update/create-drop/validate</property>
- 显示生成的SQL语句:
现在我们着重来讲解Hibernate主配置文件的其他配置中的自动生成表结构语句,key为hbm2ddl.auto的value可以有以下取值:
- create:先删除,再创建。
- update:如果表不存在,就创建;不一样就更新,一样就什么都不做(开发的时候用)。注意,update只是在增加信息的时候有效,更改的时候一般都无效。
- create-drop:初始时创建表(先删除,再创建),SessionFactory执行close()方法时删除表(要显示地调用close()方法,否则不会做删除的操作)。
- validate:验证表结构与hbm中的是否一致,如果不一致,就抛异常。
我们只要在Hibernate主配置文件中配置上自动生成表结构语句, 那么Hibernate框架会根据映射文件得到数据定义语言(DDL)来建表。
除了上面这种方式外,还有一种方式可以生成表结构,那就是使用SchemaExport工具类。
public class CreateSchema {
// 根据配置生成表结构
@Test
public void test() {
Configuration cfg = new Configuration().configure();
SchemaExport schemaExport = new SchemaExport(cfg);
// 第一个参数script的作用: print the DDL to the console
// 第二个参数export的作用: export the script to the database
schemaExport.create(true, true);
}
}
运行test()方法,会在Eclipse控制台中打印类似如下的建表语句:
drop table if exists t_user
create table t_user (
id integer not null auto_increment,
name varchar(20),
primary key (id)
)
注意:使用以上两种方式只能建表,不能建库。