Hibernate总结

Hibernate 的概念

Hibernate是数据访问层的框架,对JDBC进行了封装,是针对数据库访问提出的面向对象的解决方案。

Hibernate的作用

使用Hibernate可以直接访问对象,Hibernate自动将此访问转换成SQL执行,从而达到间接访问数据库的目的,简化了数据访问层的代码开发。

Hibernate与JDBC的对比

(1)使用JDBC具有以下缺点

----使用大量的SQL语句;

----需要大量的“?”参数赋值;

----需要将ResultSet结果集转换成实体对象;

----SQL 中包含特有函数,无法移植;

(2)使用Hibernate可以解决(1)的问题

-----自动生成SQL语句;

-----自动给“?”参数赋值;

-----自动将ResultSet结果集转换成实体对象;

-----采用一致的方法对数据库操作,移植性好;

 Hibernate与MyBatis对比

(1)共同特点

-----对JDBC进行了封装

-----采用ORM思想解决了Entity和数据库的映射问题

(2)MyBatis

-----MyBatis采用了SQL与Entity映射,对JDBC封装程度较轻

-----MyBatis自己写SQL,更具灵活性

(3)Hibernate

-----Hibernate采用数据库与Entity映射,对JDBC封装程度较重

-----Hibernate自动生成SQL,对于基本的操作,开发效率高

使用Hibernate包括:

(1)Hibernate框架设计原理:设计原理   ,   ORM思想

(2)Hibernate框架体系结构:主配置文件  ,实体类  ,映射关系文件  ,底层API

(3)使用Hibernate:Hibernate常用API  ,Hibernate使用步骤

(4)Hibernate映射类型:Java类型  ,Hibernate预定义类型

Hibernate设计原理

1)Hibernate采用了ORM思想对JDBC进行了封装。

2)Hibernate框架是ORM思想的一种实现,解决了对象和数据库映射问题。

3)Hibernate提供一系列API,允许我们直接访问实体对象,然后其根据ORM映射关系,转换成SQL并且去执行,从而达到访问数据库的目的。

ORM思想

1)ORM(Object Relation Mapping)即对象关系映射,指的是Java对象和关系数据库之间的映射。

2)ORM思想,就是对象与数据库进行相互转换思想,不同的框架技术实现ORM的手段不同,但更多的是采用(配置+反射)的方法来实现ORM。

Hibernate主配置文件(Hibernate.cfg.xml)

1)Hibernate的主配置文件是一个xml文件,通常命名为Hibernate.cfg.xml.

2)该文件中可以配置数据库连接参数,Hibernate框架参数以及映射关系文件

实体类

实体类是与数据库表对应的Java类型,它是用于封装数据库记录的对象类型

映射关系文件

1)映射关系文件指定了实体类和数据表的对应关系,以及类中属性与表中字段之间的对应关系

2)Hibernate中使用XML文件来描述映射关系,文件通常命名为“实体类.hbm.xml”并放于实体类相同的路径下。

Hibernate底层API

1)Hibernate提供了一系列的底层API基于ORM思想,对数据库进行访问

2)这些API主要是对映射关系文件的解析,根据解析出来的内容,动态生成SQL语句,自动将属性和字段映射。

Hibernate常用API

1)Configuration---->负责加载主配置文件信息,同时也加载映射关系文件信息

2)SessionFactory----->负责创建session对象

3)session----->数据库连接会话,负责执行增删改查

4)Transaction----->负责事务控制

5)Query----->负责执行特殊查询

Hibernate使用步骤

1)导入Hibernatejar包,以及数据库驱动包

2)引入Hibernate主配置文件Hibernate.cfg.xml

3)创建实体类

4)创建映射关系文件

5)使用Hibernate常用API执行增删改查

Hibernate中实体对象的3种状态

对象持久性

在Hibernate中可以把实体对象看成3种状态,分别是临时态  ,持久态  和  游离态

注意:持久态对象不能被垃圾回收,且能够被数据库自动地更新

临时态

转换:1)通过new创建的对象为临时态

           2)通过delete方法操作的对象转换为临时态

特征:1)临时态的对象可以被垃圾回收

           2)临时态的对象未进行持久化未与session关联

游离态

转换:通过session的evict  ,clear  ,close方法操作的对象会转化为游离态

特征:1)游离态对象可以被垃圾回收

           2)游离态的对象进行过持久化,但已经于session解除了关联

持久态

转换:1)通过get  ,load  ,list  ,iterate方法查询到的对象为持久态

           2)通过save  ,update,方法操作的对象转换为持久态

特征:1)持久态对象垃圾回收器不能回收

           2)持久态的对象进行了持久化,与session相关联,即持久态对象存在于session缓存中,由session负责管理(存放在一级缓存中

           3)持久态对象的数据可以自动更新到数据库中。时机是在调用session.flush()时进行的。而提交事务时会调用session.flush()。因此提交事务时也会触发同步,可以理解为:ts.commit=session.flush()+commit

Hibernate中批量插入一组数据

void batchAdd(List<Emp> emps){

     Session session=HibernateUtil.getSession();
     Transaction ts=session.beginTransaction();
     for(int i=0;i<emps.size();i++){
          session.save(e);
          if(i%1000==0){
              session.flush();
              session.clear();
     }
 }
  ts.commit();
  HibernateUtil.close();
}

延迟加载

延迟加载的概念:

在使用某些Hibernate方法查询数据时,Hibernate返回的只是一个空对象(除了ID属性外都是null),并没有正真查询数据库。而是在使用这个对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中,这种查询查询时机推迟到对象访问时的机制称之为延迟加载

使用延迟加载的原因:

1)可以提升内存资源的使用率

2)可以降低对数据库的访问次数

采用延迟加载的方法:

1)session.load();

2)query.iterate();

3)关联映射中对关联属性的加载

延迟加载实现原理

采用延迟加载方法,返回的对象类型是Hibernate采用CGLIB技术在内存中动态生成的类型,该类型是原实体类的子类,并在子类中重写了属性的get方法。

Open Session in view

1)在项目中Dao只是负责查询出来数据,而使用数据的时机是在jsp解析的过程中,因此要避免在DAO中关闭session或者说要在是视图层保持session的开启

2)项目中解决这个问题的手段称之为OpenSession in view即在视图层保持session的开启

3)在不同的技术框架下,实现OpenSession in view的手段不同

------servlet中使用过滤器实现

------struts2中使用拦截器实现

-----在Spring中使用AOP实现

一级缓存

概念:

     Hibernate创建每个session对象时,都会给该session分配一块独立的缓存区,用于存放该session查询出来的对象,这个分配给session的缓存区称之为一级缓存也叫session级缓存

使用一级缓存的优势:

        session取数据时,会优先向缓存区去取数据,如果存在数据则直接返回,不存在才会去数据库查询,从而降低了数据库的访问次数,提升了代码运行效率。

如何使用一级缓存?

一级缓存默认是开启的,在使用Hibernate的API进行查询时会自动使用

注意:

(1)一级缓存是session独享的,每个session不能访问其他session的缓存区

(2)session的save  ,update  ,delete操作会触发缓存更新

session.evict()  ---->将obj从一级缓存中移除

session.clear()---->清除异己缓存中的所以的obj

session.close()---->关闭session,释放缓存空间

关联映射

关联映射的概念

      若两张表具有关联关系,我们可以在实体对象和映射关系文件中配置这种关系。然后使用Hibernate操作其中一张表时,它可以通过配置关系自动的帮我们操作其中一张表时,它可以通过配置自动的帮我们操作另一张表,这种通过配置自动操作另一张表的手段称之为关联映射。

关联映射的作用

1)当我们操作一张表的时候,Hibernate可以通过关联映射自动的帮我们操作其关系表

2)这种关联操作包括:

   -----管理来呢查询出关系的数据

   -----关联新增,修改关系表的数据

   -----关联删除关系表的数据

3)关联映射的类型:

   -----一对多关联

   -----多对一关联

   -----多对多关联

   -----一对一关联

   -----继承关联

 如何使用关联映射

1)明确两张表的关系及其关系字段

2)在实体类中添加关联属性

     在实体类上体现两张表的关系,一般情况下是在当前的实体类中增加一个属性,用于封装其关系表的数据。

3)在映射关系文件中配置关联关系

      在映射关系文件中配置出2个对象的关系,以及他们的关系类型。

原文地址:https://www.cnblogs.com/peachwang/p/7414112.html