Hibernate框架学习笔记

1.Hibernate 是什么

Hibernate属于ORM (Object Relative Mapping)最顶级的框架,完全面向对象操作数据库。

ORM框架分为四级

DBUtils 是第一级,最初级的ORM,只能封装一下结果集。

Mybatis是第二级。

2.Hibernate 的框架搭建

1.导包

需要导入mysql驱动包 还有 Hibernate 的 核心jar包。

2.创建数据库,准备表

3.书写ORM元数据(对象与表的映射配置文件)

1.导入约束

2.实体

3.配置 表与JavaBean 的映射。在每个JavaBean下创建xxx.hbm.xml. 配置表与实体的关系,每一个表的主键都至少有一个主键生成策略。。

4.书写主配置文件

1.导入配置hibernate配置文件的dtd约束。

2.hibernate主配置

①必须属性配置

②可选属性配置

③元数据引入配置

5.书写代码测试

Configuration

SessionFactory

 Session

Transaction

查询

修改

删除

封装工具类

Hibernate中的实体规则

一、实体类创建的注意事项

① 持久化类应提供无参构造方法

②成员变量私有,提供公有的get/set方法,需提供属性

有get set方法的成员变量才能称之为属性,否则只能称之为成员变量。

③持久化类中的属性,应尽量使用包装类型。

使用包装类型不会给我们带来任何不便,而且会多提供一个null值。。有时候数据库中存的是NULL值  我们在调用Hibernate的get方法给实体赋值的时候,如果赋给基本数据类型有可能要报错。。

④持久化类需要提供oid(主属性)与数据库中的主键列对应。

⑤ 不要用final修饰class

 hibernate是运用cglib代理生成代理对象,代理对象是继承被代理对象。如果被代理对象的类被final修饰,则代理对象则不能继承被代理对象。

二、主键类型

①自然主键(少见)

      表的业务列中,有某业务列符合,必须有并且不重复的特征时,该列可以作为主键使用。

②代理主键

表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键。

③主键生成策略(7个)

identity:主键自增

increment:主键自增,由hibernate维护,每次插入前会查询当前表中的最大值,然后+1作为新主键值.(效率低,有线程安全问题)。

 

hibernate中的对象的三种状态

1.瞬时态

Customer customer = new Customer();  对象刚创建出来,没有任何容器的时候。

2.持久态

持久态就是通过session与数据库中的对象建立了联系。有了主键,通过session.save(c); 使的对象中的数据持久化。。

3.托管态|游离态

当某个持久化状态的实例与session 的连接被关闭后,就变成了脱管态。脱管态对象中拥有持久化表示OID。并且仍与数据库中的数据存在关联。只是失去了当前session 的联系。

Hibernate 一级缓存

缓存的作用:提高效率。 Hibernate 的一级缓存就是Session缓存,Session缓存是一块内存空间,用来存放相互管理的Session对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配的OID对象,就将他直接从一级缓存中取出,否则去数据库中查找相应的数据。当从数据库中查询出所需数据的时候,也会把他放到Session缓存中,当执行session.clear()或者session.close()方法时清除缓存。

缓存拍照

当从数据库找出所需要的持久化对象时,会复制一份到缓存中,一个放到快照中。当提交事务前程序对持久化对象进行修改与快照和缓存中的对象作比较,如果有差异会把他同步到数据库,否则不修改。update方法不会设置拍照,会把持久化对象直接放到session缓存中。

hibernate中的事务

ACID

A:Atom 原子性

C:consistent 一致性

I:Isolation 隔离性

D:durable 持久性

事务并发问题

1.脏读 一个事物读取到另一个事务中未提交的数据

2.不可重复读 一个事物读到另一个事务已经提交的update数据。导致在同一个事务中的多次查询结果不一致。

3.虚读/幻读:一个事物读到另一个事物中已经提交的数据,多次查询结果不一致。

事务的隔离级别

1.读未提交:一个事物在执行过程中,既可以访问到其他事物未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事物开始写数据,则另外一个事物不允许同时进行写操作,但允许其他事务读取此行数据,此隔离级别防止丢失更新。

2.已提交读:一个事务在执行过程中,既可以访问其他事务新插入的数据,又可以访问成功修改的数据,读取数据的事务允许其他事务访问该行数据。但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可以有效防止脏读。

3.可重复读:一个事务在执行过程中,可以访问其他事务新插入的数据,但是不能访问其他事务新修改的数据。读取数据的事务禁止写事务(但允许读事务),写事务将禁止其他任何事务。次隔离级别可有效防止脏读和不可重复读、

4.序列化/串行化:多个事务只能排排队执行,就是没了并发。事务的并发问题就不存在了。。

在项目中如何管理事务

1.业务开始之前打开事务,业务执行之后提交事务,执行过程出错后回滚事务。

2.在dao层操作数据库时需要用到session对象。在service控制层也需要用到session对象。我们要确保dao层和service层用的是同一个session对象、我们使用getCurrentSession()方法即可获得与当前线程绑定的session对象

    注意1:使用getCurrentSession 必须在主配置中进行一段配置。

注意2: 通过getCurrentSession 方法获得的session对象提交事务时,session会自动关闭。不要手动调用close。

Hibernate中的批量查询

1.HQL查询(Hibernate Query Language)

属于面向对象查询语言。

条件查询

分页查询

2.Criteria查询

Hibernate自创的无语句查询

基本查询

条件查询

分页查询

3.原生SQL查询

 

一对多关系

多对一关系

多对多关系

 

查询总结

1.oid查询 

session的get方法

2.对象属性导航查询。

 从持久化对象中 获取与它有关系的所有对象的数据。

3.HQL

Hibernate Query Language.

4.Criteria

没有sql语句的查询,全部调用函数即可。

5.原生SQL

 

查询优化

为了提高效率 fetch的选择上选择select(单表查询) lazy 的取值应选择true(确定懒加载) 全部使用默认值

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值