hibernate框架学习之核心API

时间:2022-07-01 13:50:01

Configuration
SessionFactory
Session
Transaction
Query
Criteria

Configuration

Configuration对象用于封装Hibernate的配置信息,在Hibernate框架启动后,需要装载对应的配置文件。Hibernate的配置文件有两种格式
hibernate.properties文件(早期格式)
hibernate.cfg.xml文件(常用格式)

使用hibernate.properties加载配置
  Configuration conf = new Configuration ();//此方式无法配置资源文件,必须手动添加
资源文件添加方式
  添加配置文件(非主流)
    conf. addResource(“cn/itcast/h3/user/vo/UserModel.hbm.xml”);
  添加持久化类(非主流)
    conf.addClass(UserModel.class);
    此方式Hibernate会自动读取当前类所在目录下同名的配置文件,UserModel.hbm.xml,所以在进行配置文件的命名时尽量保持两个文件名相同,不推荐使用不同名称的文件

使用hibernate.cfg.xml加载配置
Configuration conf = new Configuration.configure();
此方式可以将资源文件通过XML配置的方式加入配置文件
资源文件配置方式
添加配置文件(主流)
  <mapping resource="cn/itcast/h3/user/vo/UserModel2.hbm.xml"/>
添加持久化类(非主流)
  <mapping class="cn.itcast.h3.user.vo.UserModel"/>

SessionFactory

SessionFactory对象根据Configuration对象加载的配置信息创建得到,其中封装了配置信息中有关数据库的信息、所有的映射关系及预定义SQL语句
SessionFactory对象是线程安全的
SessionFactory对象可以通过Configuration对象获得
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
由于SessionFactory对象的创建需要基于所有的配置信息,因此创建此对象需要消耗大量的资源,通常一个应用程序中只初始化一个SessionFactory对象

Session

Session对象是Hibernate与应用程序APP进行交互的桥梁,应用程序与Hibernate之间通过Session进行数据交互,其功能相当于JDBC中的Connection
Session对象描述的是一次Hibernate与APP的会话信息,因此Session对象是线程不安全的。在使用时要保障该对象只出现在方法内部运行,而不要共享
Session对象位于应用程序与数据库之间,应用程序需要持久化的对象交由Session传递给数据库,应用程序需要获取数据库的信息也同样是从Session对象处获取,Session对象可以看做是一个数据调度中心

hibernate框架学习之核心API

应用程序添加、删除、修改数据
应用程序在进行增删改操作时,将数据传递给Session对象,Session对象持有应用程序要进行操作的数据,此时数据并未执行对应的SQL语句。当Session对象执行关闭操作前,会将所持有的数据同步到数据库中,也可通过flush方法手动刷新session对象的数据存储空间,完成数据同步。但是这一切要基于事务开启的状态,否则即便执行SQL语句,不提交事务也将无意义。
应用程序查询数据
Hibernate查询得到的数据在Session未关闭前同样受Session的管理,满足上述规则。

Session常用操作

save(Object) / persist(Object)
update(Object)
saveOrUpdate(Object)
delete(Object);
get(Class, Serializable) / load(Class, Serializable)
createQuery(String) / createSQLQuery(String)
createCriteria(Class) 条件查询

HibernateUtil工具类的制作

package cn.itcast.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
private static Configuration conf = null;
//静态的SessionFactory
private static SessionFactory sf = null;
static{
conf = new Configuration().configure();
sf = conf.buildSessionFactory();
}
public static SessionFactory getSf(){
return sf;
}
/**
* 获取Session对象
* @return 全新的Session对象
*/
public static Session getSession(){
return sf.openSession();
}
}

Transaction

Transaction对象描述Hibernate执行过程中事务对象
数据库操作中事务是保障数据操作成功的重要因素
事务操作主要包含以下几种
开启事务
Transaction t = s.beginTransaction();
提交事务
t.commit();
回滚事务
t.rollback();

Hibernate为了避免开发者在使用事务时未进行事务处理,在核心配置中添加了自动事务的解决方案,但是这种事务处理机制是针对Session的操作的,换言之每次进行Session操作都会为其提供一个独立的事务。详细内容到核心配置部分讲解。

Query

Query对象描述了用于进行查询操作的对象,Query对象执行查询操作需要使用HQL语言。Query对象通过Session对象获得
Query q = s.createQuery("from UserModel");
其中“from UserModel”使用的就是HQL语言的语法规则
HQL语言是Hibernate框架中根据SQL语言发展得到的一种面向对象操作格式的查询语句,是Hibernate中主流的查询方式。

使用Query进行查询
步骤:
  获得Session对象
  编写HQL语句(字符串格式)
  由Session对象创建执行查询操作的Query对象,并传入HQL语句作为参数
    HQL语句编写时应满足预编译SQL的语法格式
    如果HQL语句中有参数,为Query对象指定操作的参数
    有关HQL语句中携带参数的查询后面详细讲解
    执行Query对象的数据列表方法获得查询结果
    q.list();
    q.uniqueResult();

Query进行查询的结果
Query对象获取查询结果的方式有两种
使用list()获得查询结果
使用uniqueResult()获得查询结果

使用list()获得查询结果
list方法用于获得查询数据结果为0到多条的情况
list方法执行后得到List集合,其中封装了查询的结果,结果要根据具体的查询语句结构来进行解析,数据有两种格式
对象模型(***Model)
HQL格式:“from UserModel”
HQL格式:“select um from UserModel um”
对象数组(Object[])
HQL格式:”select userName,age from UserModel“
查询的内容超过一个,返回一个对象数组,封装查询结果

投影

投影是将返回Object[]的对象封装成对象模型的格式
投影在使用时使用构造方法完成
1)首先在模型类中声明投影需要的构造方法
例如UserModel类中创建带有userName和age属性的构造方法
2)然后查询时修改HQL语句,改为投影格式
原始格式:select userName,age from UserModel
投影格式:select new UserModel(userName,age) from UserModel
3)最后从Query对象中获得的查询结果就是封装完成的对象
List<UserModel> queryList = q.list();
投影要求构造方法参数必须与HQL语句中参数顺序完全相同,并且要求大量的构造方法才能全兼容(不常用)。

使用uniqueResult()获得查询结果
uniqueResult方法用于获得查询数据结果为1条的情况
uniqueResult方法执行后得到Object对象,其中封装查询的结果
uniqueResult常用于获得聚合函数的查询结果
查询数据总量:select count(uuid) from UserModel
查询最大数据:select max(age) from UserModel

Query进行分页查询

1)Query对象可以对查询结果进行局部获取,也就是JEE中常用的“分页查询”结果
2)Query对象进行查询数据局部获取
设定查询的第一条数据编号
q.setFirstResult(10);
设置查询结果保留索引从第10条开始的数据
设定查询的数据总量
q.setMaxResults(20);
设置查询结果保留共20条数据
3)Query对象的分页查询结果可以根据数据库类型不同,自动生成对应的语句(与方言设置匹配)

Query可变参数条件查询

hibernate框架学习之核心API

Criteria

Cirteria对象描述了用于进行按条件查询操作的对象,它可以按照面向对象的格式传递查询条件。
Cirteria对象通过Session对象获得,创建时需要
Criteria c = s.createCriteria(UserModel.class);
其中UserModel.class是要查询的数据模型类
使用Criteria对象可以省去书写SQL或HQL的环节

使用Criteria进行查询(简)
步骤:
1)获得Session对象
2)由Session对象创建执行查询操作的Criteria对象
Criteria c = s.createCriteria(UserModel.class);
3)如果存在有查询条件,为查询添加查询条件(后面详细讲解)
c.add(Restrictions.eq("userName", "jockme"));
4)执行Criteria对象的数据列表方法获得查询结果
c.list();
c.uniqueResult();