hibernate框架学习之核心API
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();
hibernate框架学习之核心API的更多相关文章
- hibernate框架学习之核心配置文件
hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration ...
- hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等
核心API Configuration 描述的是一个封装所有配置信息的对象 1.加载hibernate.properties(非主流,早期) Configuration conf = new Conf ...
- hibernate框架学习笔记3:API详解
Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...
- Hibernate框架学习(二)——api详解
一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. //1.创建,调用空参构造(还没有读配置文件) Configuration conf=new Configur ...
- [ SSH框架 ] Hibernate框架学习之二
一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...
- hibernate框架学习笔记6:事务
MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...
- [ 学习笔记 ] Hibernate框架学习之一
一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...
- [ SSH框架 ] Hibernate框架学习之三
一.表关系的分析 Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置.数据 ...
- Hibernate框架学习(一)——入门
一.框架是什么 1.框架是用来提高开发效率的 2.封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现 3.框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可 二.hibern ...
随机推荐
- JAVA核心技术I---JAVA基础知识(内部类)
一:内部类概述 (一)定义 内部类(Inner Class)是定义在其他类中或方法中的类,包含内部类的类通常称作Enclosing Class 内部类的功能通常与包含它的类的功能有紧密的关联 内部类的 ...
- Timus 1132 Square Root(二次剩余 解法2)
不理解,背板子 #include<cstdio> using namespace std; int Pow(int a,int b,int p) { ; ) ) res=1LL*a*res ...
- 解决centos7命令行中文乱码
-------------centos7解决中文乱码问题[root@localhost ~]# cat /etc/locale.conf LANG=en_US.UTF-8[root@localhost ...
- 深入理解Python异步编程(上)
本文代码整理自:深入理解Python异步编程(上) 参考:A Web Crawler With asyncio Coroutines 一.同步阻塞方式 import socket def blocki ...
- 谈谈java程序代码保护及license设计
理论上讲,不存在牢不可破的漏洞,只是时间和成本问题.通常我们认为的不可破解,说的是破解需要难以接受的时间和成本.对于java程序来说,class文件很容易被反编译,所以理论上而言,对java程序做li ...
- C++引用以及定义常见问题总结
最近在做数据结构的实验,暴露了一些典型问题,这里总结一下,避免以后出错 编译时报一个特别长的错:“无法解析的外部符号”,行号还是1,应该看一下定义的成员函数有没有还没有实现就被调用的,实验接口普遍挺多 ...
- Docker 获取镜像 - 一
docker images docker 镜像获取方式: 1.pull 可以直接从网上拉取: 2.import 可以从现有容器打包成一个镜像: 3.commit 可以从现有容器一个镜像: 4.bu ...
- CTF 湖湘杯 2018 WriteUp (部分)
湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1. CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...
- Coursera, Big Data 1, Introduction (week 1/2)
Status: week 2 done. Week 1, 主要讲了大数据的的来源 - 机器产生的数据,人产生的数据(比如社交软件上的update, 一般是unstructed data), 组织产生的 ...
- JavaScript实现框选效果
<html> <head> <title>region</title> <style> body { margin: 0; padding: ...