为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate第二天 实现增删改查 一级缓冲等等

标签:
Java MySQL

Hibernate_day02
1 实体类编写规则

2 hibernate主键生成策略

3 实体类操作
(1)crud操作
(2)实体类对象状态

4 hibernate的一级缓存

5 hibernate的事务操作
(1)事务代码规则写法

6 hibernate其他的api(查询)

实体类编写规则
1 实体类有无参数构造

2 实体类属性私有的

3 私有的属性通过公开的set和get方法操作

4 hibernate要求实体类有一个属性作为唯一值
(1)一般使用id作为唯一值

5 hibernate建议
(1)如果定义属性,属性类型建议不使用基本数据类型,使用对应的包装类
(2)比如表示学生分数,假如 int类型,
int score = 10;
表示学生得了0 分 int score = 0;
表示学生没有参加考试,使用int类型不能准确表示出来
使用int包装类
Integer score = 10;
表示学生没有参加考试, Integer score = null;
(3)包装类
int – Integer
char – Character
其他都是基本数据类型的首字母大写 double – Double

Hibernate主键生成策略
1 在映射配置文件中,配置实体类唯一属性值和表主键对应,class属性中有值,这个值表示生成策略,使用 native

2 使用最多的native,
(1)根据使用的数据库类型,自动选择使用的值
(2)实体类属性类型int类型(包装类)

3 经常使用值 uuid
(1)如果使用uuid值时候,实体类属性类型不能是int类型,是String类型

4 快速创建表,检验配置是否正确
(1)在工具类里面,写main方法,执行之后,如果配置有问题,出现下面提示:

Hibernate的实体类对象操作
使用hibernate进行CRUD操作
1 调用session里面的方法实现crud操作

(1)添加操作 : 调用session里面的save方法
首先,创建实体类对象
其次,调用session里面save方法实现,在save方法中传递创建对象

(2)根据id查询:调用session里面的get方法

(3)修改操作:调用session里面的update方法
修改过程:进行查询,再进行修改
第一步 进行查询:根据id查询,调用get方法,返回对象
第二步 向返回的对象里面设置新的值
第三步 调用update方法进行修改

(4)删除操作:调用session里面的delete方法
首先根据id查询对象,调用delete方法,把查询的对象传递到方法里面

实体类对象状态介绍(了解)
1 实体类对象有三种状态
(0)区分状态的方式

  • 实体类对象里面是否id值
  • 实体类对象是否与session有关联

(1)瞬时态:没有id值,与session没有关系

(2)持久态:有id值,与session有关系

(3)托管态:有id值,与session没有关系

2 状态直接的转换
(1)瞬时态 转换 持久态 : 调用save方法实现
(2)托管态 转换持久态: 调用update方法实现

Hibernate的一级缓存
什么是缓存
数据库本身是文件系统,操作数据库底层使用io操作,效率不是很高
所以把数据存到系统内存中,读取数据很快

Hibernate缓存机制
Hibernate提供两种缓存
第一种 一级缓存
(1)一级缓存特点:
特点1: 一级缓存在hibernate操作中默认打开的,直接使用
特点2: 一级缓存使用范围,是session范围,在session创建和session关闭的范围中使用一级缓存,session关闭一级缓存没有了
特点3: 一级缓存中缓存持久态数据

第二种 二级缓存(不用,替代redis)

验证一级缓存
1 验证方式
(1)根据id=2进行查询,返回对象
(2)在这个session里面,再根据id=2进行查询

一级缓存执行过程(了解)

Hibernate的事务
事务概念
1 什么事务

2 事务四个特性

3 不考虑隔离性产生读问题

4 解决读问题
(1)设置事务隔离级别
(2)mysql默认隔离级别 repeatable read

Hibernate事务
1 hibernate要求手动控制事务

2 hibernate事务代码写法
try {
//提交事务
}catch() {
//回滚
}finally {
//关闭
}

3 代码
@Test
public void testCache() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();

        //根据uid=2查询记录
        User user1 = session.get(User.class, 2);
        System.out.println("user1:"+user1);

        //出现异常
        int o = 10/0;

        //根据uid=2查询记录
        //是否输出语句? 没有查询数据库
        User user2 = session.get(User.class, 2);
        System.out.println("user2:"+user2);

        //提交事务
        tx.commit();

    }catch(Exception e) {
        e.printStackTrace();
        //回滚
        tx.rollback();
    }finally {
        //关闭代码
        //关闭
        session.close();
        sessionFactory.close();
    }
}

Hibernate对Session管理
1 session是单线程对象
(1)只有自己使用,不能被公用

2 解决方案
(1)把session与本地线程绑定

3 得到与本地线程绑定的session
(1)在hibernate核心配置文件中,配置打开与本地线程绑定的session

(2)调用sessionFactory里面的方法得到与本地线程绑定的session

(3)session与本地线程绑定在一起,session不需要手动关闭

Hibernate的其他api
1 今天演示 进行查询表里面所有记录

2 在hibernate第四天演示查询其他操作
(1)条件查询
(2)分页查询
(3)排序查询

Query对象
1 写hql语句:hibernate query language,hibernate提供查询语言,和普通sql很相似
(1)区别: 使用普通sql操作表和字段
使用hql操作实体类和属性
(2)查询所有语句: from 实体类名称

2 具体演示操作
第一步 创建Query对象
(1)调用session里面的方法创建
第二步 调用query对象里面的方法得到结果

Criteria对象
1 使用这种方式,不需要写任何语句,都是调用方法实现

2 具体实现
第一步 创建critica对象
第二步 调用critica对象里面的方法得到结果

SQLQuery对象
1 这种方式可以使用普通sql实现

2 实现步骤
第一步 创建对象
第二步 调用方法得到结果

解决配置文件没有提示
第一种 可以上网

第二种 把dtd约束文件导入到本地工具
(1)复制这一行语句

(2)在eclipse中进行配置

(3)重新启动eclipse

案例-客户列表
1 在servlet得到所有客户的list,把list放到域对象

2 在dao里面使用hibernate进行查询所有的操作

总结
1 实体类编写规则
(1)要求实体类有一个属性唯一值
(2)属性类型使用包装类

2 hibernate实现crud操作
(1)添加
(2)根据id查询
(3)修改
(4)删除
(5)查询所有

  • 有三个对象实现

3 hibernate一级缓存
(1)一级特点

4 hibernate事务
(1)hibernate事务代码写法
(2)hibernate获取与本地线程绑定session

5 案例- 客户列表

复习知识
1 表与表之间关系
(1)一对多
(2)多对多
(3)一对一

2 一对多建表方式

3 多对多建表方式

图片上传不了 主要要用的api在笔记中有说明 其他应用的几率很低

点击查看更多内容
9人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消