SSH之Hibernate总结篇

  • 内容
  • 评论
  • 相关

SSH之Hibernate总结篇

Hibernate

hibernate 简介:

 hibernate是一个开源ORM(Object/Relationship Mipping)框架,它是对象关联关系映射的持久层框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。

为什么要用hibernate(jdbc的缺点):

 1、编程的时候很繁琐,用的try和catch比较多

  2、jdbc没有做数据的缓存

  3、没有做到面向对象编程

  4、sql语句的跨平台性很差

JDBC的优点:

效率高!

hibernate的优点:

    1、完全的面向对象编程

  2、hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存   重点

  3、编程的时候就比较简单了

  4、跨平台性很强

  5、使用场合就是企业内部的系统

hibernate的缺点:

    1、效率比较低

  2、表中的数据如果在千万级别,则hibernate不适合

  3、如果表与表之间的关系特别复杂,则hibernate也不适合

Hibernate所需包说明:

  说明:

              javassist包是用来创建代理对象的

                代理对象的三种创建方式:

                        1、jdkproxy

                        2、cglib

                        3、javassist

             jta: Java Transaction API,是sun公司给分布式事务处理出来的规范

hibernate.cfg.xml:

  主要的用途:

              告诉hibernate连接数据库的信息,用的什么样的数据库(方言)

              根据持久化类和映射文件生成表的策略

五个核心接口:

    • Configuration:负责配置并启动hibernate,创建SessionFactory  
    • SessionFactory:负责初始化hibernate,创建session对象
    •        1、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
      •        2、sessionFactory中存放的信息都是共享的信息
      •        3、sessionFactory本身就是线程安全的
      •        4、一个hibernate框架sessionFactory只有一个
      •        5、sessionFactory是一个重量级别的类

Session:负责被持久化对象CRUD操作

          1、得到了一个session,相当于打开了一次数据库的连接         

          2、在hibernate中,对数据的crud操作都是由session来完成的

      • T

    ransaction:负责事务相关操作

    •         hibernate中的事务默认不是自动提交的  
    •         设置了connection的setAutoCommit为false        
    •         只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction
  • Query:负责执行各种数据库查询

hibernate.cfg.xml文件的加载:


 

 

hibernate.cfg.xml文件的加载:

属性名字 含义  
hibernate.show_sql 是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
hibernate.format_sql 输出到控制台的语句是否进行排版,便于阅读,建议设置为true
hbm2ddl.auto 可以帮助由java代码产生数据库脚本,进而生成具体的表结构(create|update|create drop|validate)
hibernate.default_schema 默认的数据库
hibernate.dialect 配置Hibernate数据库方言,Hibernate可针对特殊的数据库进行优化

注:hibernate的前缀可以省略,即:hibernate.dealict==dealect

表的生成策略:

 

  increment:先找到主键的最大值,在最大值基础上+1

  identiry:表的自动增长机制,主键必须是数字类型,效率比increment高,但id值不连续

  sequence:

  native:

  assigned:在程序中手动设置主键的值

  uuid:

Hibernate的执行流程:

  1.         开始
  2.         启动Hibernate
  3.         构建Configuration实例

  4.         Configuration实例加载hibernate.cfg.xml文件至内存
  5.         Configuration实例根据hibernate.cfg.xml文件加载映射文件(*.hbm.xml)至内存
  6.         Configuration实例构建一个SessionFactory实例

  7.         SessionFactory实例创建Session实例

  8.         由Session实例创建Transaction的一个实例,开启事务

  9.         通过Session接口提供的各种方法操作数据库

  10.          提交事务或回滚事务

  11.         关闭Session

  12.         结束

查询操作之get和load的区别: 

 

  两个方法都是从数据库获取数据

    get():若数据库无此数据,则返回null;

    load():懒加载模式,若数据库无此数据,则会报错ObjectNotfountException异常,

  所以,load加载数据一定要保证其数据存在。

 

flush()

  

  

openSession与getCurrentSession的区别:

  • getCurrentSession在事务提交或回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession没有手动关闭,多次使用之后可能会导致连接池溢出。
  • openSession每次创建新的Session对象,getCurrentSession使用现有的Session对象。

hbm常用的设置:

 <hibernate-mapping  //属性

    schema="schemaName"  //模式的名字

    catelog="catelogName"  //目录的名称

    default-cascade="cascade_style"  //级联风格

    default-access="field|property|ClassName"    //访问策略

    default-lazy="true|false"    //加载策略

    package="packagename"

  />

 

  <class

    name="ClassName"  //映射的类名

    table="tableName"  //对应数据库的映射表名

    batch-size="N"    //抓取策略,一次住多少条数据

    where="condition"  //条件

    entity-name="EntityName"  //支持同一个类映射成多个表名(用的少)

  />

 

  <id

    name="propertyName"

    type="typeName"

    column="colunm_name"

    length="length"

    <generator class="generatorClass"/>

  />

Query

  1. 获得Hibernate Session对象

  2. 编写HQL(Hibernate Query Language)语句

  3. 调用session.createQuery创建查询对象

  4. 如果HQL语句包含参数则调用Query的setXxx设置参数
  5. 调用Query对象的list()或uniqueResult()执行查询

Criteria(条件查询)

  Criteria查询语句又叫QBC查询(Query By Criteria)

  Criterion接口是Hibernate矿浆提供的一个面向对象的查询接口

    Restrictions工厂类  -->Criterion对象

  使用Criteria对象查询数据的几个步骤:

    1.                   获得Hibernate的Session对象
    2.                   通过Session获得Criteria对象
    3.                   使用Restrictious的静态方法创建Criterion条件对象
    4.                   向Criteria对象添加Criterion查询条件
    5.                   执行Criteria的list()或uniqueResult()获得结果

 

hibernate关联映射

  • 一对多(one to many):在"多"的一方,添加"一"的一方的主键作为外键(学生和班级,在学生的一方添加外键(班级的主键)作为属于哪个班级)
  • 多对一(many to one):
  • 一对一(one to one):在任意一方引入对方主键作为外键,两个主键成为联合主键
  • 多对多(many to many):产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键

 

   ·反转

 inverse属性值为false(默认),相当于两端都能控制。在实际开发中,如果是一对多的关系,会将"一"的一方的inseverse设置为true,即由"多"的一方来维护关系,如果是多对多的关系,随意一方即可

  inverse只对<set>、<onetomany>、<manytomany>有效,对<manytoone>、<onetoone>无效。

    ·级联

cascade定义的是有关联关系的对象之间的级联关系

    • save-update:执行保存和更新操作时进行级联操作
    • delete:执行删除时进行级联操作
    • delete-orphan
    • all:对所有操作进行级联操作
    • all-delete-orphan
    • none:对所有操作不进行级联操作

      ★当设置了cascade属性部位none时,hibernate会自动持久化所关联的对象

      ★cascade属性的设置会带来性能上的变动,需谨慎设置

Hibernate检索方式

  1. 导航对象图检索方式(前提是必须在对象关系映射文件配置多对一关系)

  2. OID检索方式(get()、load())

  3. QBC检索方式

  4. HQL检索方式(Hibernate Query Language)

  5. 本地SQL检索方式

投影查询:用来查询对象的部分属性

动态实例查询:

    注:必须有构造方法和无参构造

 

条件查询:

  1. 按参数位置查询

  2. 按参数名称查询

     

分页查询:

setFirstResult(int firstResult)

  setMaxResult(int maxResult)

 

  firstResult 默认值 0

  maxResult 默认值 全部

 

lazy(3个懒加载)

 需要数据的时候才要加载

    1、类的懒加载(get()数据不存在则返回null,load()如果数据不存在,则报异常)

    session.load方法产生的是代理对象,该代理类是持久化类的子类

    2、集合的懒加载

       set的延迟加载:

             true

             false

             extra

         说明:

             1、因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改了。

             2、延迟加载是通过控制sql语句的发出时间来提高效率的

    3、manytoone的懒加载

       对于性能来说,没有什么影响,所以随便怎么样都行

 

抓取策略

  join:左外连接

    select:默认的值

    subselect:子查询

    (比如:根据需求分析,判断出来该需求分析中含有子查询,所以抓取策略应该用“subselect”)

 

    说明:

      1、因为抓取策略的设置在映射文件中,所以一旦映射文件生成就不能改变了。

      2、通过发出怎么样的SQL语句加载集合,从而优化效率的

 

 

一级缓存(生命周期和Session保持一致)

  • 一级缓存位置:  

   get():可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来

    save():该方法可以把一个对象放入到一级缓存中

    evit():可以把一个对象从session的缓存中清空

    update():可以把一个对象放入到一级缓存(session)中

    clear():清空一级缓存中所有的数据

    close():当调用session.close方法的时候,一级缓存的生命周期就结束了

  

          创建session的方式

分布式缓存

一级缓存内存结构

二级缓存(二级缓存的生命周期和sessionFactory是一致的)

  • 实用场合

   公开的数据

       数据基本上不发生变化

       该数据保密性不是很强

    说明:如果一个数据一直在改变,不适合用缓存。

  • 设置二级缓存

利用的是ehcache实现的二级缓存

      1、在hibernate的配置文件中

  二级缓存的供应商、开启二级缓存:必须有!

 

二级缓存的统计机制默认是关闭的,用来验证save方法有没有保存到二级缓存

 

  2、指定哪个类(或者集合)开启二级缓存(两种方法) 

      第一种:在映射文件里这么写:

       <class name="com.xjh.hibernate.domain.Classes">

        <cache usage="read-only"/>

      第二种:在hibernate.cfg.xml里这么写:

        <class-cache usage="reand-only" class=""/>

 

  • 有哪些方法可以把对象放入二级缓存中

get方法,list方法可以把一个或者一些对象放入到二级缓存中

 

  • 哪些方法可以把对象从二级缓存中提取出来

get方法,iterator方法可以提取

查询缓存

 

一级缓存和二级缓存都是对象缓存:就是把该对象对应的数据库表中的所有的字段全部查询出来了,这种查询在某些场合下会让效率降低。例如:表中的字段特别多,但是程序中所需要的字段却很少。

       查询缓存也叫数据缓存:内存(页面)中需要多少数据就把多少数据放入到查询缓存中。

 

  • 生命周期

只要一些数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该缓存的生命周期就结束了。

 

  • 操作步骤

  1. 在hibernate的配置文件中,开启查询缓存

  2.使用查询缓存

 

总结:

 

hibernate总共有三种缓存

    一级缓存解决的问题是在一次请求中,尽量减少和数据库交互的次数,在session.flush之前,改变的是一级缓存的对象的属性。当session.flush的时候才要跟数据库交互,一级缓存解决不了重复查询的问题。一级缓存是对象缓存。

    二级缓存可以把经常不改变、常用的公共的数据放入进来,可以重复查询,利用get方法和iterator方法可以把二级缓存中的数据得到。二级缓存也是对象缓存。

    查询缓存可以缓存数据或者对象,可以利用list方法把查询缓存中的数据放入到缓存中。

    查询缓存中存放的是数据,是数据缓存。

 

 

转载请注明出处:http://www.cnblogs.com/Java-web-wy/

 

不好问别人为你做了什么,

而要问你为别人做了什么。

喜欢 2

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Title - Artist
0:00