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对象可以看做是一个数据调度中心
应用程序添加、删除、修改数据
应用程序在进行增删改操作时,将数据传递给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可变参数条件查询
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();
作者:架构师小跟班
开发者导航: http://www.codernav.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出,以免更多的人被误导。