Hibernate学习笔记(二)
我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改
以下是b站视频地址:
https://www.bilibili.com/video/av14626440
*实现添加操作
第一步 加载hibernate核心配置文件
第二步 创建SessionFactory对象
<!--
因为SessionFactory创建时会去检测数据库来进行创建表或更新,所以非常耗费资源,所以一般创建工具类来创建SessionFactory对象
-->
第三步 使用SessionFactory创建session对象
第四步 开启事务
第五步 写具体逻辑 crud操作
第六步 提交事务
第七步 关闭资源
@Test
public void testAdd() {
// 第一步 加载hibernate核心配置文件
// 到src下面找到名称是hibernate.cfg.xml
//在hibernate里面封装对象
Configuration cfg = new Configuration();
cfg.configure();
// 第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建sessionFactory
//在过程中,根据映射关系,在配置数据库里面把表创建
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 第三步 使用SessionFactory创建session对象
// 类似于连接
Session session = sessionFactory.openSession();
// 第四步 开启事务
Transaction tx = session.beginTransaction();
// 第五步 写具体逻辑 crud操作
//添加功能
User user = new User();
user.setUsername("小王");
user.setPassword("250");
user.setAddress("日本");
//调用session的方法实现添加
session.save(user);
// 第六步 提交事务
// 第七步 关闭资源
session.close();//本地线程绑定的session也不需要关闭
//sessionFactory.close(); /*sessionFactory如果是静态加载的则不需要关闭*/
}
*创建的SessionFactory工具类
public class HibernateUtil {
static SessionFactory sessionFactory = null;
static Configuration cfg = null;
//静态代码块,静态代码块会在代码执行时首先运行
static {
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
//创建SessionFactory
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
*Session对象
1)session对象是单线程对象,只能自己使用,不能共用
*事务的提交和回滚
tx.commit();//提交
tx.rollback();//回滚
*hibernate主键生成策略
还有其他类型,但是通常不使用
*hibernate查询get()操作
User user = session.get(User.class,1);
*hibernate修改操作
/*先查询再修改*/
User user = session.get(User.class,1);
user.setUsername("东方不败");
session.update(user);
*hibernate删除操作
/*先查询再删除*/
User user =session.get(User.class, 1);
session.delete(user);
*实体类对象状态(概念)
1)瞬时态:对象里面没有id值,和session对象没有关联
2)持久态:对象里面有id值,和session对象也有关联
3)托管态:对象有id值,但是和session对象没有关联
*hibernate其他操作实体类对象的方法
1)saveOrUpdate()
如果实体类对象状态是瞬时态,进行添加操作
实体类对象是托管态时,进行修改操作
实体类对象是持久态时,进行修改操作
*hibernate的一级缓存
.什么是缓存
1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
(2)把数据放到内存中,提供读取效率
.hibernate缓存
1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
2 hibernate缓存特点:
第一类 hibernate的一级缓存
(1)hibernate的一级缓存默认打开的
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须 持久态数据
第二类 hibernate的二级缓存
(1)目前已经不使用了,替代技术 redis
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围
*hibernate一级缓存特性
1)持久态自动更新数据库
2)执行过程
*hibernate事务规范代码写法
try{
开启事务
提交事务
}catch(){
回滚事务
}finally{
关闭
}
*hibernate绑定Session
.获取与本地线程绑定的Session
1)在hibernate核心配置文件中配置
<property name="name.current_session_context_class" >thread</property>
2)在工具类中提供返回session的方法
一般也写在工具类中
sessionFactory.getCurrentSession();
.获取与本地线程绑定的session时,关闭时报错
SessionException:Session was already closed 所以与本地线程绑定的 session不需要手动关闭
*hibernate中的一些API的使用
.Query对象
注意:5.3版本中org.hibernate.Query对象已过时,这里导入的是org.hibernate.query.Query包
1.使用Query对象,不需要写sql语句,但是写hql语句
1)hql:hibernate query language /*hibernate提供的查询语句*/
2)hql和sql的区别
sql操作的是表和字段
hql操作的实体类对象和对象的属性
2.查询所有的hql语句
1)from 实体类对象
3.Query对象使用
1)创建Query对象
2)调用Query对象里面的方法得到结果
.Critica对象
1.使用这个对象就不需要写hql语句,直接调用对象的方法就能进行查询操作
2.实现过程
1)创建Critica对象
2)调用Critica对象里面的方法得到结果
.SQLQuery对象
1.调用底层SQL实现
2.实现过程
1)创建SQLQuery对象
2)调用SQLQuery对象里面的方法得到结果
3) SQLQuery返回的是数组
4)设置返回的是对象形式 sqlQuery.addEntity(User.class);
.CriticaQuery
在hibernate5.2版本之后,为了符合jpa规范,上述Critica已过时,推荐使用符合规范的CriticaQuery对象