01_Hibernate-----概述

01 Hibernate

 

  1. Hibernate名片

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

  1. 持久化

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

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

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

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

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

[4]查询:对应标准SQL中的SELECT语句。在Hibernate中,往往特指使用专门的查询API查询特定的数据。查询API包括HQL查询和QBC查询。

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

扫描二维码关注公众号,回复: 6211495 查看本文章

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

 

 

 

  1. ORM

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

对象:Java程序中用于封装业务数据的对象。通常称为实体类(Entity),以JavaBean(POJO)技术实现。例如:Book 、User、Person等等这样的类的对象。

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

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

⑤基于JDBC的ORM

Java概念

数据库概念

属性

字段

对象

记录

⑥基于Hibernate的ORM

  1. 单表映射
  2. 单向多对一关联关系
  3. 双向多对一关联关系
  4. 基于外键的一对一关联关系
  5. 基于主键的一对一关系关系
  6. 单向多对多关联关系
  7. 双向多对多关联关系
  1. Hibernate特点

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

Java代码

student.setStudentName("Jerry2015");

Hibernate自动生成的SQL语句

    update

        STUDENTS

    set

        STUDENT_NAME=?,

        AGE=?,

        BIRTHDAY=?

    where

        STUDENT_ID=?

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

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

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

④屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。

  1. MySQL分页:LIMIT
  2. Oracle分页:ROWNUM

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

         Plain Old Java Object

  1. 安装Hibernate插件

参见:《[尚硅谷]_参考资料:安装Hibernatetools插件.doc》

  1. 搭建Hibernate开发环境

①导入Hibernate需要的JAR包

hibernate-release-4.2.4.Final\lib\required目录下的全部

②导入数据库驱动

mysql-connector-java-5.1.7-bin.jar

③创建Hibernate自身的配置文件: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/hibernate0106</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 映射文件位置 -->

   

    </session-factory>

</hibernate-configuration>

 

④创建持久化类PO Persistence Object (POJO类,实体类,数据模型类):Student

⑤创建持久化类对应的关系映射文件:Student.hbm.xml文件

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

[2]配置方式

<hibernate-mapping>

     <!-- class元素表示将Java持久化类映射为数据库表 -->

     <!-- name属性指定持久化类的全类名,table属性指定数据库表的表名 -->

    <class name="com.sirius.bean.Student" table="STUDENTS" >

   

     <!-- id元素表示将持久化类的OID属性映射为数据库表的主键 -->

     <!-- name属性用于指定持久化类中OID属性名(使用getXxx()setXxx()定义的) -->

     <!-- type属性用于指定映射为数据库表时使用的类型 -->

        <id name= "studentId" type ="java.lang.Integer">

           <!-- column元素用于指定当前属性映射为数据库表中的字段名 -->

            <column name= "STUDENT_ID" />

            <!-- generator元素用于指定生成主键的方式:主键的生成策略 -->

            <!-- native属性表示使用数据库本地适合的方式生成主键 -->

            <generator class= "native" />

        </id>

       

        <!-- 映射一般的持久化类属性 -->

        <property name= "studentName" type="java.lang.String" >

            <column name= "STUDENT_NAME" />

        </property>

        <property name= "age" type ="int">

            <column name= "AGE" />

        </property>

        <property name= "birthday" type ="java.util.Date">

            <column name= "BIRTHDAY" />

        </property>

    </class >

</hibernate-mapping>

 

 

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

     <!-- 3.当前要使用的hbm 映射文件位置 -->

     <!-- 以路径的形式指定映射文件的位置,不要写成点符号 -->

     <mapping resource="com/sirius/bean/Student.hbm.xml" />

 

  1. 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主张将所有持久化操作都纳入到事务控制中,哪怕仅仅是只读操作。

 

  1. 持久化类

①概念

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

②具体要求

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

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

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

[4]final:在Hibernate中需要通过为持久化类创建代理对象的方式实现延迟加载策略,final类无法被继承从而无法创建其代理对象。

         基于继承的方式实现代理的。(代理类是目标类的子类。)

         Cglib,Javassist

 

  1. HelloWorld

①测试目标:使用Hibernate实现将Student对象保存到数据库中。

②实现步骤

[1]创建SessionFactory对象

     (1)创建Configuration对象封装Hibernate的配置信息。

注意:仅通过构造器创建Configuration对象读取不到配置信息,还需要再调用configure()方法加载配置文件。

Configuration configuration = new Configuration().configure();

 

     (2)创建ServiceRegistry对象用于注册Hibernate配置信息

     这是Hibernate4中新增的特性。

              <1>创建构建ServiceRegistry对象的ServiceRegistryBuilder对象

ServiceRegistryBuilder builder = new ServiceRegistryBuilder();

 

              <2>通过builder对象接收configuration对象中封装的配置信息

builder.applySettings(configuration.getProperties());

 

              <3>通过builder对象构建ServiceRegistry对象

ServiceRegistry serviceRegistry = builder.buildServiceRegistry();

 

     (3)通过Configuration对象创建SessionFactory对象

SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);

 

[2]通过SessionFactory对象创建Session对象,也就是开启和数据库之间的一次会话

Session session = factory.openSession();

 

[3]开启事务

Transaction transaction = session.beginTransaction();

 

[4]执行操作

Student student = new Student(null, "Tom2015", 20, new Date());

session.save(student);

 

[5]提交事务

transaction.commit();

 

[6]关闭Session

session.close();

 

[7]关闭SessionFactory

factory.close();

 

  1. 数据库表生成策略

①概述

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文件中的列在数据表中不存在,则抛出异常

猜你喜欢

转载自blog.csdn.net/SSM_spring/article/details/90142243
今日推荐