本文总结了Hibernate7个核心API:Configuration、SessionFactory、Session、Transaction、Query、Criteria、SQLQuery
目录
-
Configuration:配置对象
Configuration主要用于Hibernate框架加载映射文件
Configuration类的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中扮演着一个很小的角色,但它是启动hibernate时所遇到的第一个对象。
在使用Hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。
Configuration config = new Configuration();
config.configure();
到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面。
-
SessionFactory:Session工厂对象
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可以重复利用的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
在核心配置文件中,数据库配置方面:
<!-- hibernate帮创建表,需要配置之后
update: 如果已经有表,更新,如果没有,创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
具体实现(写工具类,写静态代码块实现,因为静态代码块在类加载时候执行,执行一次)
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
-
Session:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的Session不同于JSP应用中的HttpSession。这里当使用Session这个术语时,其实是指Hibernate中的Session,而以后会将HttpSession对象称为用户Session。
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在Session的管理下才能进行持久化操作。
获取Session对象的操作(两种操作)
//2 获取session,创建的是一个新的Session实例,需手动关闭
Session session = sessionFactory.openSession();
//2 获取session,绑定在了当前线程中,自动关闭
Session session = sessionFactory.getCurrentSession();
调用session里面不同的方法实现crud操作
(1)添加 save方法
(2)修改 update方法
(3)删除 delete方法
(4)查询 get方法(根据主键查询)
(5)createQuery、createSQLQuery方法(用于数据库操作对象)
(6)createCriteria方法(条件查询)
-
Transaction
Transaction接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。Transaction接口是对实际事物实现的一个抽象,这些实现包括JDBC的事物、JTA中的UserTransaction、甚至可以是CORBA事物。之所以这样设计是让开发者能够使用一个统一事物的操作界面,使得自己的项目可以在不同的环境和容器之间方便移植。
Transaction接口主要用于管理事物,它是Hibernate的数据库事物接口,且对底层的事务接口进行了封装。
事务开启的实现:
Transaction tx = session.beginTransaction();
事务管理的常用方法:(事务的提交与回滚)
// 提交事务
tx.commit();
// 回滚事务
tx.rollback();
-
Query
Query代表面向对象的一个Hibernate查询操作。在Hibernate中,通常使用session.createQuery()方法接受一个HQL语句,然后调用Query的list()或uniqueResult()方法执行查询。
HQL语句:hibernate query language,hibernate提供查询语言,这个hql语句和普通sql语句很相似
区别:
——使用sql操作表和表字段
——使用hql操作实体类和属性
使用Query对象查询:
//1 创建Query对象
//方法里面写hql语句
Query query = session.createQuery("from User");
//2 调用query对象里面的方法得到结果
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
-
Criteria
使用这个对象查询操作,但是使用这个对象的时候,不需要写语句,直接调用方法实现。
2. 实现过程
(1)创建criteria对象
(2)调用对象里面的方法得到结果
//1 创建criteria对象
//方法里面参数是实体类class
Criteria criteria = session.createCriteria(User.class);
//2 调用方法得到结果
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
-
SQLQuery
使用hibernate时候,调用底层sql实现
2. 实现过程
(1)创建对象
(2)调用对象的方法得到结果
//1 创建对象
//参数普通sql语句
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
//调用sqlQuery里面的方法
//返回list集合,默认里面每部分数组结构
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
//返回的list中每部分是对象形式,设置将数据放到参数表示的实体中去
sqlQuery.addEntity(User.class);
//调用sqlQuery里面的方法
List<User> list = sqlQuery.list();
for (User user : list) {
System.out.println(user);
}