zoukankan      html  css  js  c++  java
  • 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个对象的关系,以及他们的关系类型。

  • 相关阅读:
    U盘出现大量乱码文件,并且不能彻底删除
    使用命令生成配置文件
    input只读属性readonly和disabled的区别
    将sublime添加到鼠标右键
    mysql-front导入数据失败:“在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符”
    typeof运算符
    react input 设置默认值
    时间格式转换
    去除字符串首尾空格
    ES6基础知识汇总
  • 原文地址:https://www.cnblogs.com/peachwang/p/7414112.html
Copyright © 2011-2022 走看看