hibernate-day02
1.实体类编写规则
1.实体类的属性要是私有的
2.私有属性使用公开的set,get方法操作
3.要求实体类有属性作为唯一值(一般用id)
4.实体类属性建议不使用基本数据类型,而是使用包装类
(1)八个基本数据类型对应包装类
int-Integer char-Character …等等
2hibernate主键生成策略
hibernate要求实体类里面有一个属性作为唯一值,
hibernate主键生成策略有很多值:
increment
用于long、short、 或int类型,由Hibernate 自动以递增的方式生
成唯一标识符,每次增量为1。只有当没有其它进程向同一张表中插入
数据时才可以使用,不能在集群环境下使用。适用于代理主键。
identity
采用底层数据库本身提供的主键生成标识符,条件是数据库支持
自动增长数据类型。在DB2、MySQL、MS SQL Server、 Sybase 和
HypersonicSQL数据库中可以使用该生成器,该生成器要求在数据库中
把主键定义成为自增长类型。适用于代理主键。
sequence
Hibernate根据底层数据库序列生成标识符。条件是数据库支持序
列。适用于代理主键。
native
根据底层数据库对自动生成表示符的能力来选择identity 、
sequence、hilo 三种生成器中的-种,适合跨数据库平台开发。适用于
代理主键。
uuid
Hibernate采用128位的UUID算法来生成标识符。该算法能够在
网络环境中生成唯一的字符串标识符,其UUID被编码为一一个长度为
32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键
比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned
由java程序负责生成标识符,如果不指定id元素的generator属性,
则默认使用该主键生成策略。适用于自然主键。生成策略值 uuid
(1)使用uuid生成策略,实体类id属性类型 必须 字符串类型
3.实体类操作
(1)crud
添加操作:
User user = new User();
user.setUname("小脑斧");
user.setAddress("河南省南阳市西峡县");
user.setPassword("zahzha");
session.save(user);
通过id查询
//第四步通过id查询
User user = session.get(User.class, 1);
System.out.println(user);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Hg9u9Zr-1597127787721)(file:///C:\Users\Lenovo\AppData\Roaming\Tencent\Users\1605367528\QQ\WinTemp\RichOle{NV26CV%MWX@N%[EMW$~{}8.png)]
更新操作
首先要先查询再修改,先通过id查询之后再进行修改
User user = session.get(User.class, 1);
System.out.println(user);
//查完再改
user.setUname("张小娴");
user.setAddress("郑州市");
session.update(user);
删除操作
3 实体类对象状态
实体类对象有三种状态
瞬时态
对象里面没有id,对象与session也没有关系
2,持久态、
对象里面有id ,对象与sassion有关系
托管态
对象有id ,但是对象与session没关系
saveOrUpdate()方法
4.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范围
验证一级缓存存在
1 验证方式
(1)首先根据uid=1查询,返回对象
(2)其次再根据uid=1查询,返回对象
第一步执行get方法之后,发送sql语句查询数据库
第二个执行get方法之后,没有发送sql语句,查询一级缓存内容
一级缓存执行过程
5.hibernate的事务操作
(1)事务代码的书写规范
事务相关概念
1 什么是事务
在数据库操作中,-项事务(Transaction) 是由- -条或多条操作数据库的SQL语句组成的一一个
不可分割的工作单元。当事务中的所有操作都正常完成时,整个事务才能被提交到数据库中,如果
有一项操作没有完成,则整个事务会被回滚。
其实事务总结起来理解为:逻辑上的一组操作,组成这组操作的各个单元,要么一起成功,要
么一起失败。
2 事务特性
ACID原则,原子性,一致性,隔离性,持久性
3 不考虑隔离性产生问题(事务的并发问题)
(1)脏读 一个事务读取到另一个未提交的事务
(2)不可重复读 一个事务读取到另一个已经提交的update的数据,导致多次查询结果不一样
(3)虚读 一个事务读取到另一个事务已经insert的事务的数据,导致多次查询的结果不同
4 设置事务隔离级别
(1)mysql默认隔离级别 repeatable read
Hibernate事务代码规范写法
1 代码结构
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 session类似于jdbc的connection,之前web阶段学过 ThreadLocal
2 帮实现与本地线程绑定session
3 获取与本地线程session
(1)在hibernate核心配置文件中配置
(2)调用sessionFactory里面的方法得到
4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了
6.hibernate的其他api(查询)
(1)Query
1 使用query对象,不需要写sql语句,但是写hql语句
(1)hql:hibernate query language,hibernate提供查询语言,这个hql语句和普通sql语句很相似
(2)hql和sql语句区别:
- 使用sql操作表和表字段
- 使用hql操作实体类和属性
2 查询所有hql语句:
(1)from 实体类名称
3 Query对象使用
(1)创建Query对象
(2)调用query对象里面的方法得到结果
@Test
public void test(){
try{
//与本地绑定的session
sessionFactory =HibernateUtil.getSessionFactory();
session= HibernateUtil.getSessionObject();
transaction=session.beginTransaction();
//创建Query对象
Query query = session.createQuery("from User");
//第二步调用query对象 得到结果
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
//提交
transaction.commit();
}catch (Exception e){
e.printStackTrace();
//回滚
transaction.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
(2)Criteria
1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
2 实现过程
(1)创建criteria对象
(2)调用对象里面的方法得到结果
(3)SQLQuery
1 使用hibernate时候,调用底层sql实现
2 实现过程
(1)创建对象
(2)调用对象的方法得到结果
返回list集合每部分是数组
返回list中每部分是对象形式