Hibernate<一>一款工做在持久化层的大型、开源、免费的ORM框架

一、Hibernate名片java

    Hibernate是一款工做在持久化层大型开源免费ORM框架。mysql

二、持久化sql

    ①狭义:将数据从“不可掉电”设备保存到“能够掉电”的设备上。数据库

    ②广义:指与数据库相关的一切操做。缓存

        [1]保存:对应标准SQL中的INSERT语句。安全

        [2]删除:对应标准SQL中的DELETE语句。session

        [3]更新:对应标准SQL中的UPDATE语句。app

        [4]查询:对应标准SQL中的SELECT语句。在Hibernate中,每每特指使用专门的查询API查询特定的框架

数据。查询API包括HQL查询和QBC查询。性能

        [5]加载:在Hibernate中,加载指的是根据对象的OID查询数据库中的一条具体的记录。

说明:OID——Object ID,特指Java对象中与数据库表的主键相对应的一个属性。

三、ORM

    ①概念:Object/Relationship Mapping,对象关系映射

    ②对象:Java程序中用于封装业务数据的对象。一般称为实体类(Entity),以JavaBean(POJO)技术实

现。例如:Book 、User、Person等等这样的类的对象。

    ③关系关系型数据库,目前主流的数据库都是关系型的。

    ④映射:创建从“对象”到“关系型数据库”之间的对应关系。

    ⑤基于JDBC的ORM

    ⑥基于Hibernate的ORM

        l  单表映射

        l  单向多对一关联关系

        l  双向多对一关联关系

        l  基于外键的一对一关联关系

        l  基于主键的一对一关系关系

        l  单向多对多关联关系

        l  双向多对多关联关系

四、Hibernate特色

    ①将对数据库的操做转换为对象Java对象的操做,从而简化开发。

    经过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。

    ②提供线程和进程两个级别的缓存提高应用程序性能。

    ③有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。

    ④屏蔽不一样数据库实现之间的差别。在Hibernate中只须要经过“方言”的形式指定当前使用的数据库,就

能够根据底层数据库的实际状况生成适合的SQL语句。

    ⑤非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO便可。

五、建立Hibernate自身的配置文件(分析内容,以Boo.java示例):hibernate.cfg.xml 

<hibernate-configuration>
    <session-factory >
   
     <!-- 1.应用程序链接数据库所须要使用的基本信息 -->
     <!-- 链接数据库的用户名 -->
     <property name="hibernate.connection.username" >root</property>
     
     <!-- 链接数据库的密码 -->
     <property name="hibernate.connection.password" >root</property>
     
     <!-- 链接数据库的URL地址 -->
     <property name="hibernate.connection.url" >jdbc:mysql://localhost:3306/hibernate</property >
     
     <!-- 链接数据库的数据库驱动的全类名 -->
     <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver </property>
     
     <!-- 2.Hibernate自身运行所须要指定的信息 -->
     <!-- 是否要显示SQL -->
     <!-- 关于显示SQL:使用Hibernate操做数据库是由Hibernate向数据库发送SQL语句,指定为true时会在控制台打印发送的SQL语句 -->
     <property name="show_sql">true</ property>
     
     <!-- 是否要格式化SQL -->
     <!-- 将控制台打印的SQL语句格式化 -->
     <property name="format_sql">true</ property>
     
     <!-- 生成数据库表的策略 -->
     <!-- 使用Hibernate能够根据 hbm文件自动生成数据库表,可使用这个选项指定生成方式 -->
     <property name="hbm2ddl.auto">update</ property>
     
     <!-- 当前使用的数据库方言 -->
     <!-- 数据库方言:对于一样的操做,不一样数据库有本身各自不一样的实现,表现为不一样语法风格的SQL语句 -->
     <!-- 指定数据库方言要使用特定的值: 在官方的hibernate-release-4.2.4.Final\project\etc\hibernate.properties文件中可以找到 -->
     <property name="hibernate.dialect" >org.hibernate.dialect.MySQL5InnoDBDialect </property>
     
     <!-- 3.当前要使用的hbm 映射文件位置 -->
     <!-- 以路径的形式指定映射文件的位置,不要写成点符号 -->
     <mapping resource="com/bingbinlee/bean/Book.hbm.xml" />
 


    </session-factory >
</hibernate-configuration>

    ①建立持久化类:Book.java

    ②建立持久化类对应的关系映射文件:Book.hbm.xml文件

        [1]建立位置:和持久化类在同一个包下

        [2]配置方式

<hibernate-mapping>
     <!-- class元素表示将Java持久化类映射为数据库表 -->
     <!-- name属性指定持久化类的全类名,table属性指定数据库表的表名 -->
    <class name="com.bingbinlee.bean.Book" table="BOOK" >
   
     <!-- id元素表示将持久化类的OID属性映射为数据库表的主键 -->
     <!-- name属性用于指定持久化类中OID属性名(使用getXxx()和setXxx()定义的) -->
     <!-- type属性用于指定映射为数据库表时使用的类型 -->
        <id name= "bookId" type ="java.lang.Integer">
           <!-- column元素用于指定当前属性映射为数据库表中的字段名 -->
            <column name= "BOOK_ID" />
            <!-- generator元素用于指定生成主键的方式:主键的生成策略 -->
            <!-- native属性表示使用数据库本地适合的方式生成主键 -->
            <generator class= "native" />
        </id>
       
        <!-- 映射通常的持久化类属性 -->
        <property name= "bookName" type="java.lang.String" >
            <column name= "BOOK_NAME" />
        </property>
        <property name= "quantity" type ="int">
            <column name= "QUANTITY" />
        </property>
        <property name= "createDate" type ="java.util.Date">
			<column name= "CREATE_DATE" />
        </property>
    </class >
</hibernate-mapping>

    ③在hibernate.cfg.xml文件中声明映射文件的位置

<!-- 3.当前要使用的hbm 映射文件位置 -->
     <!-- 以路径的形式指定映射文件的位置,不要写成点符号 -->
     <mapping resource="com/bingbinlee/bean/Book.hbm.xml" />

六、Hibernate常见API介绍

    ①Session

        表明Hibernate应用程序和数据库之间的一次会话,做用至关于JDBC中的Connection。 

 

    ②SessionFactory

        建立Session对象的工厂

            ●针对单个数据库映射关系通过编译后的内存镜像,是线程安全的。

            ●SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。

            ●构造SessionFactory很消耗资源,通常状况下一个应用中只初始化一个 SessionFactory对象。

            ●Hibernate4新增了一个ServiceRegistry 接口,全部基于Hibernate的配置或者服务都必须统一贯

这个ServiceRegistry注册后才能生效。

            ●建立SessionFactory对象的步骤

                [1]建立封装配置信息的Configuration对象。

                [2]在ServiceRegistry对象中注册配置信息。

                [3]经过Configuration对象构建SessionFactory对象。

    ③Configuration

        负责管理Hibernate的配置信息

        ●hibernate.cfg.xml文件中的信息:数据库URL地址、用户名、密码、JDBC驱动类、数据库方言、数

据库链接池参数等。

        ●*.hbm.xml文件中的信息:持久化类与数据库表之间的对应关系。

    ④Transaction

        表明一次数据库事务。Hibernate主张将全部持久化操做都归入到事务控制中,哪怕仅仅是只读操做。

七、 持久化类

    ①概念

        在Hibernate中,咱们将封装业务数据的实体类称为持久化类。持久化类通过Hibernate映射后能够自动生成对应的数据库表。原则上Hibernate不要求持久化类实现任何接口或继承任何类,POJO便可,因此Hibernate是一个非侵入式框架。

    ②具体要求

        [1]有无参的构造器,便于经过反射建立对象。

        [2]有OID属性:就像数据库表必定要有主键同样,持久化类也必定要有OID属性用于和数据库表的主

键相对应。

        [3]包含使用JavaBean风格声明的属性:getXxx()和setXxx()方法

        [4]final:在Hibernate中须要经过为持久化类建立代理对象的方式实现延迟加载策略,final类无

法被继承从而没法建立其代理对象。

八、数据库表生成策略

    ①概述

        Hibernate在建立SessionFactory对象时,会根据*.hbm.xml映射文件中的信息自动生成对应的数据库

表,而在生成数据库表的过程当中,能够根据不一样的配置信息采起不一样的生成策略。

    ②配置方式

        在hibernate.cfg.xml配置文件中加入以下配置

<property name="hbm2ddl.auto">update</property>

    ③能够选择的生成策略

        [1]create:根据*.hbm.xml文件生成新的数据库表,并且是每一次运行都删除旧表建立新的表,即便两

次操做的过程当中数据库表没有任何改变

        [2]update:按照以下几种状况生成数据库表

            <1>数据库表不存在:生成新的数据库表

            <2>数据库表存在且表结构不须要改变:保留原来的数据库表

            <3>数据库表存在但表结构有变化:在原来数据库表的基础上更新数据库表,不会删除原有的行和列

       [3]create-drop:每一次运行都生成新的数据库表,并在执行操做后将表删除

       [4]validate:会和数据库中的表进行比较,若*.hbm.xml文件中的列在数据表中不存在,则抛出异常

    ④其余配置

        [1]hibernate.jdbc.fetch_size

        做用:控制Statement对象读取数据的时候每次从数据库中取出的记录条数。

        说明:例如一次查询1万条记录,对于Oracle的JDBC驱动来讲,是不会1次性把1万条取出来的,而

只会取出fetchSize条数,当结果集遍历完了这些记录之后,再去数据库取fetchSize条数据。所以大大节省

了无谓的内存消耗。fetchSize设的越大,读数据库的次数越少,速度越快;fetchSize越小,读数据库的次

数越多,速度越慢。Oracle数据库的JDBC驱动默认的fetchSize=10,是一个保守的设定,根据测试,当

fetchSize=50时,性能会提高1倍之多,当fetchSize=100,性能还能继续提高20%,fetchSize继续增大,

性能提高的就不显著了。并非全部的数据库都支持fetchSize特性,例如MySQL就不支持。

        [2]hibernate.jdbc.batch_size

        做用:设置批量增删改时的批次大小,相似于设定缓冲区大小。

        说明:batchSize越大,批量操做时向数据库发送SQL语句的次数越少,速度就越快。测试结果是当

batchSize=0的时候,使用Hibernate对Oracle数据库删除1万条记录须要25秒,batchSize=50的时候,删

除仅仅须要5秒!Oracle数据库batchSize=30的时候比较合适。

相关文章
相关标签/搜索