Hibernate_day02(转载传智播客的老师讲义,博主只图查看方便)
Hibernate_day02
上节内容
1 web内容回顾
2 hibernate概述 (1)orm思想
3 hibernate入门案例
4 hibernate的配置文件
5 hibernate的核心api |
今天内容
1 实体类编写规则
2 hibernate主键生成策略 (1)native (2)uuid
3 实体类操作 (1)crud操作 (2)实体类对象状态
4 hibernate的一级缓存
5 hibernate的事务操作 (1)事务代码规范写法
6 hibernate其他的api(查询) (1)Query (2)Criteria (3)SQLQuery |
实体类编写规则
1 实体类里面属性私有的
2 私有属性使用公开的set和get方法操作
3 要求实体类有属性作为唯一值(一般使用id值)
4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据类型对应的包装类 - int – Integer - char—Character、 - 其他的都是首字母大写 比如 double – Double (2)比如 表示学生的分数,假如 int score; - 比如学生得了0分 ,int score = 0; - 如果表示学生没有参加考试,int score = 0;不能准确表示学生是否参加考试
|
Hibernate主键生成策略
1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2 hibernate主键生成策略有很多的值
3 在class属性里面有很多值 (1)native: 根据使用的数据库帮选择哪个值 (2)uuid:之前web阶段写代码生成uuid值,hibernate帮我们生成uuid值
4 演示生成策略值 uuid (1)使用uuid生成策略,实体类id属性类型 必须 字符串类型 (2)配置部分写出uuid值
|
实体类操作
对实体类crud操作
添加操作
1 调用session里面的save方法实现 |
根据id查询
1 调用session里面的get方法实现 |
修改操作
1 首先查询,修改值 (1)根据id查询,返回对象 |
删除操作
1 调用session里面delete方法实现 |
实体类对象状态(概念)
1 实体类状态有三种 (1)瞬时态:对象里面没有id值,对象与session没有关联 (2)持久态:对象里面有id值,对象与session关联
(3)托管态:对象有id值,对象与session没有关联
2 演示操作实体类对象的方法 (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范围 |
验证一级缓存存在
1 验证方式 (1)首先根据uid=1查询,返回对象 (2)其次再根据uid=1查询,返回对象 第一步执行get方法之后,发送sql语句查询数据库 第二个执行get方法之后,没有发送sql语句,查询一级缓存内容 |
Hibernate一级缓存执行过程
|
Hibernate一级缓存特性
1 持久态自动更新数据库
2 执行过程(了解) |
Hibernate事务操作
事务相关概念
1 什么是事务
2 事务特性
3 不考虑隔离性产生问题 (1)脏读 (2)不可重复读 (3)虚读
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报错,不需要手动关闭了 |
Hibernate的api使用
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对象里面的方法得到结果
|
Criteria对象
1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
2 实现过程 (1)创建criteria对象 (2)调用对象里面的方法得到结果 |
SQLQuery对象
1 使用hibernate时候,调用底层sql实现
2 实现过程 (1)创建对象 (2)调用对象的方法得到结果 返回list集合每部分是数组
返回list中每部分是对象形式 |
完成任务
1 查询表所有记录,把记录显示页面中 (1)servlet里面调用service,service调用dao (2)在dao里面使用hibernate实现操作 (3)在页面中显示所有数据 - 在servlet里面把list集合放到域对象 - 在jsp中使用el表达式+foreach标签获取
2 复习知识 (1)一对多和建表 (2)多对多和建表 |