4天--Hibernate学习(day02)

今天内容:

1 实体类(web阶段叫做javaBean)的编写规则

 

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 = null;(错)不能准确的表示学生是否参加考试

-解决:使用包装类就可以了,Integer score = 0,表示学生得了0分,

- 表示学生没有参加考试,Integer score = null ;

  • Hibernate主键生成策略

1.hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略

4天--Hibernate学习(day02)_第1张图片4天--Hibernate学习(day02)_第2张图片

3.在classs属性里面有很多值

(1)native:根据你使用的数据库帮我们选择用哪个值

4天--Hibernate学习(day02)_第3张图片

(2)uuid:之前web阶段写代码来生成uuid值,而hibernate帮我们生成uuid的值

4天--Hibernate学习(day02)_第4张图片

4.演示生成策略值是uuid

(1)使用uuid生成策略,实体类id属性类型必须是字符串型,将user类中的属性换成字符串类型

(2)然后将native值换成uuid

这样生成表的特点是:

4天--Hibernate学习(day02)_第5张图片

这样每次都会随机的生成一个uuid值:(代码简化了很多)

  • 实体类操作:

对实体类的crud操作:

添加操作:

1.调用session里的save方法实现:

4天--Hibernate学习(day02)_第6张图片

根据id查询:(返回一个对象(一条记录))

(ps:要是多条记录需要返回一个list)

4天--Hibernate学习(day02)_第7张图片

4天--Hibernate学习(day02)_第8张图片

修改操作:

1.首先查询,修改值

(1)先根据id查询,返回对象

4天--Hibernate学习(day02)_第9张图片

4天--Hibernate学习(day02)_第10张图片

删除操作:

(ps:本来都码完字了,结果没有保存上,,,黑人问号.jpg)

1 调用session里面delete方法实现

 

实体类对象状态(概念)

1 实体类状态有三种

1)瞬时态:对象里面没有id值,对象与session没有关联

4天--Hibernate学习(day02)_第11张图片

2)持久态:对象里面有id值,对象与session关联

 

3)托管态:对象有id值,对象与session没有关联

 

2 演示操作实体类对象的方法

1saveOrUpdate方法:实现添加、实现修改

4天--Hibernate学习(day02)_第12张图片

 

4天--Hibernate学习(day02)_第13张图片

 

4天--Hibernate学习(day02)_第14张图片

 

Hibernate的一级缓存

什么是缓存

1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。

1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据

2)把数据放到内存中,提供读取效率

 

Hibernate缓存

1 hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式

 

2 hibernate缓存特点:

第一类 hibernate的一级缓存

1hibernate的一级缓存默认打开的

2hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围

3hibernate的一级缓存中,存储数据必须 持久态数据

 

第二类 hibernate的二级缓存

1)目前已经不使用了,替代技术 redis

2)二级缓存默认不是打开的,需要配置

3)二级缓存使用范围,是sessionFactory范围

 

验证一级缓存存在(debug)

1 验证方式

1)首先根据uid=1查询,返回对象

2)其次再根据uid=1查询,返回对象

4天--Hibernate学习(day02)_第15张图片

4天--Hibernate学习(day02)_第16张图片

第一步执行get方法之后,发送sql语句查询数据库

第二个执行get方法之后,没有发送sql语句,查询一级缓存内容

 

Hibernate一级缓存执行过程

4天--Hibernate学习(day02)_第17张图片4天--Hibernate学习(day02)_第18张图片

Hibernate一级缓存特性

1 持久态自动更新数据库

4天--Hibernate学习(day02)_第19张图片

 

2 执行过程(了解)

4天--Hibernate学习(day02)_第20张图片

Hibernate事务操作

事务相关概念

1 什么是事务

 

2 事务特性

 

3 不考虑隔离性产生问题

1)脏读

2)不可重复读

3)虚读

 

4 设置事务隔离级别

1mysql默认隔离级别 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类似于jdbcconnection,之前web阶段学过 ThreadLocal

 

2 帮实现与本地线程绑定session

 

3 获取与本地线程session

1)在hibernate核心配置文件中配置

2)调用sessionFactory里面的方法得到(必须进行配置才能得到)

4天--Hibernate学习(day02)_第21张图片

 

4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了

Hibernate的api使用(分别使用三个对象做查询操作)

Query对象

1 使用query对象,不需要写sql语句,但是写hql语句

1hqlhibernate query languagehibernate提供查询语言,这个hql语句和普通sql语句很相似

2hqlsql语句区别:

- 使用sql操作表和表字段

- 使用hql操作实体类和属性

 

  2 查询所有hql语句:

(1)from 实体类名称  

 

3 Query对象使用

1)创建Query对象

2)调用query对象里面的方法得到结果

 

4天--Hibernate学习(day02)_第22张图片

Criteria对象

1 使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现

 

2 实现过程

1)创建criteria对象

2)调用对象里面的方法得到结果

4天--Hibernate学习(day02)_第23张图片

SQLQuery对象

1 使用hibernate时候,调用底层sql实现

 

2 实现过程

1)创建对象

2)调用对象的方法得到结果

4天--Hibernate学习(day02)_第24张图片

返回list集合每部分是数组

4天--Hibernate学习(day02)_第25张图片

 

返回list中每部分是对象形式

4天--Hibernate学习(day02)_第26张图片

完成任务

1 查询表所有记录,把记录显示页面中

1servlet里面调用serviceservice调用dao

2)在dao里面使用hibernate实现操作

3)在页面中显示所有数据

- servlet里面把list集合放到域对象

- jsp中使用el表达式+foreach标签获取

 

2 复习知识

1)一对多和建表

2)多对多和建表

你可能感兴趣的:(学习笔记)