Hibernate_02---实体类操作、对象状态、一级缓存、事务操作、API
一、实体类编写规则
1)实体类里面属性私有的
2)私有属性使用公开的set和get方法操作
3)要求实体类有属性作为唯一值(一般使用id值)
4)实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
应用环境:可以解决区分出 值为零(score=0)和值不存在(score=null)两种情况
八个基本数据类型对应的包装类
int – Integer
char—Character、
其余六种都是首字母大写 比如 double – Double
二、Hibernate主键生成策略
1) 实体类中有一个属性作为唯一值,对应表中主键.
2) 在class中的不同策略(属性值):
1)native: 根据使用的数据库帮选择哪个值
2)uuid:生成uuid值
插图:
演示生成策略值 uuid
1)使用uuid生成策略,实体类id属性类型 必须 字符串类型
(2)配置部分写出uuid值
三、实体类操作
对实体类crud操作
@Test
public void crudTest() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
/*
* 根据id查询
*
* session.get(类名.class, id值);
* 参数一:实体类的class
* 参数二:id值
*/
User user = session.get(User.class, 1);
/*
* 修改:
* 1)先查询,
* 2)再设置修改值,
* 3)update方法完成更新
*/
User user = session.get(User.class, 2); //查询
user.setUsername("岳不群"); //设置
session.update(user); //更新修改
/*
* 删除:
* 1)先查询,
* 2)delete方法删除查询结果
*/
User user = session.get(User.class, 2); //根据id查询对象
session.delete(user); //删除查询结果
/*
* 添加:
* 1)创建对象、
* 2)对对象进行属性设置、
* 3)save方法完成添加
*/
User user = new User();
user.setUsername("小王");
user.setPassword("250");
user.setAddress("日本");
session.save(user); //实现添加
//5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}
}
实体类对象状态(三种)
1)瞬时态:对象里面没有id值,对象与session没有关联
2)持久态:对象里面有id值,对象与session关联
3)托管态:对象有id值,对象与session没有关联
saveOrUpdate方法:
1)可以实现添加、修改两个功能。
2)虚拟机将根据实体类不同状态,执行不同功能
总结:无id时,做添加。有id时,做修改
四、Hibernate中的缓存
缓存:把数据存到内存里面
作用:可以直接从内存中读取数据,提供读取效率
背景:数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
Hibernate缓存:是hibernate框架中提供的多种优化之一。
Hibernate缓存分为两级
一级缓存:
1)默认打开
2)使用范围:session范围。从session创建到session关闭的范围
3)存储数据状态要求:必须是持久态数据
二级缓存:
1)目前已经不使用了,被redis技术替代
2)默认关闭,打开则需要配置
3)二级缓存使用范围,是sessionFactory范围
验证一级缓存的存在
做法:多次查询相同记录,
现象:只有第一次会输出sql语句查询数据库。则证明一级缓存存在。
Hibernate一级缓存特性
根据持久态操作,自动更新数据库。
Hibernate一级缓存执行过程
五、Hibernate事务操作
事务相关概念
1) 什么是事务
一组不可分割的操作。统一成功或统一失败
2) 事务特性
原子性、一致性、隔离性、持久性
3) 不考虑隔离性产生的问题
1)脏读
2)不可重复读
3)虚读
4) 设置事务隔离级别(解决三种错误读方式)
(1)mysql默认隔离级别 repeatable read
Hibernate事务代码规范写法:
代码结构:
try {
开启事务
提交事务
}catch() {
回滚事务
}finally {
关闭
}
@Test
public void testTx() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction();
//添加
User user = new User();
user.setUsername("小马");
user.setPassword("250");
user.setAddress("美国");
session.save(user);
int i = 10/0;
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}finally {
//关闭操作
session.close();
sessionFactory.close();
}
}
六、Hibernate绑定session
**1)在hibernate核心配置文件中配置**
2)调用sessionFactory里面的方法得到
七、Hibernate的api使用
Query对象
使用query对象,使用hql语句
hql:hibernate query language,hibernate提供查询语言。普通sql语句很相似
1)hql和sql语句区别:
- 使用sql操作表和表字段
- 使用hql操作实体类和属性
2 查询所有hql语句: from 实体类名称
3) Query对象使用
1)创建Query对象
2)调用query对象里面的方法得到结果
Criteria对象
1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
2 实现过程
(1)创建criteria对象
(2)调用对象里面的方法得到结果
SQLQuery对象
1 使用hibernate时候,调用底层sql实现
2 实现过程
(1)创建对象
(2)调用对象的方法得到结果
返回list集合每部分是数组
返回list中每部分是对象形式