Hibernate框架基础——Hibernate API及Hibernate主配置文件

时间:2022-01-22 08:22:53

Hibernate的学习路线图

Hibernate框架基础——Hibernate API及Hibernate主配置文件

Hibernate API简介

Configuration

Configuration类负责管理Hibernate的配置信息,包括如下内容:

  1. Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。
  2. 持久化类与数据表的映射关系(*.hbm.xml文件)。

创建Configuration的两种方式:

  1. 属性文件(hibernate.properties)

    Configuration cfg = new Configuration();
  2. Xml文件(hibernate.cfg.xml)

    • 加载默认名称的配置文件(hibernate.cfg.xml)

      Configuration cfg = new Configuration().configure();
    • 或加载指定名称的配置文件

      Configuration cfg = new Configuration().configure(“myhibernate.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();
  1. SessionFactory是线程安全的。
  2. SessionFactory是生成Session的工厂:

    Session session = sessionFactory.openSession();
  3. 构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。

SessionFactory类还有如下两个方法:

  • getCurrentSession(),后面会重点讲解。
  • close(),知道就好。

Session

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。(相当于JDBC中的Connection)
Hibernate框架基础——Hibernate API及Hibernate主配置文件

  • 持久化类与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的运行过程如下:

  1. 应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。
  2. 并用这些信息生成一个SessionFactory对象。
  3. 然后从SessionFactory对象生成一个Session对象。
  4. 并用Session对象生成Transaction对象。
    • 可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作。
    • 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

用图来表示即为:
Hibernate框架基础——Hibernate API及Hibernate主配置文件

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>

现在我们着重来讲解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)
)

注意:使用以上两种方式只能建表,不能建库