Hibernate框架学习

一、Hibernate概述

Hibernate是封装了JDBC的一种开放源代码的ORM(Object Relational Mapping,对象关系映射)框架,使程序员可以用面向对象的思想操作数据库。

通俗的来讲,即为:

  1. Hibernate将Java对象与对象之间的关系映射到数据库表与表之间的关系;将Java类映射到数据库表;将Java对象的属性映射到表中的列;将java类的实例化对象映射为对应表中的一行记录
  2. 开发人员直接操作对象,不需要编写复杂的SQL语句。通过对象的属性和方法来进行数据的读取、修改和删除等操作。

Hibernate关键特性

  1. 对象关系映射(ORM):将Java对象与数据库表进行映射。包括基本数据类型、集合、集成、关联(如一对一、一对多、多对多)等复杂映射
  2. 自动生成SQL:自动生成SQL语句,以便将对象数据存储到数据库中或从数据库中检索数据。且提供了面向对象的语言HQL,类似于SQL,但操作的是类和属性,而不是表和列
  3. 缓存机制:支持一级缓存(Session缓存)和二级缓存(SessionFactory缓存)机制,用于提供查询性能和减少数据库的访问。(1)Session缓存是会话级别的缓存,保存了会话期间加载的实体对象;(2)SessionFactory缓存是跨会话的缓存,可以在多个会话之间共享缓存数据
  4. 事务管理:集成了Java事务API(JTA),可以通过编程或者声明式的方式管理数据库事务
  5. 延迟加载:允许按需加载关联对象,提高查询性能
  6. 对象状态管理:通过跟踪对象的状态来管理对象的持久化。提供持久化、脱管和删除等状态之间的转换,使开发人员能够方便地操作对象。
  7. 数据验证:支持在持久化操作之前验证数据,确保数据的一致性和完整性

二、Hibernate工作原理

在这里插入图片描述
Hibernate的工作原理如下:

  1. 首先,Configuration读取Hibernate的配置文件 hibernate.cfg.xml和映射文件*.hbm.xml中的信息,即加载配置文件和映射文件,并通过Hibernate配置文件生成一个多线程的SessionFactory对象
  2. 然后,多线程SessionFactory对象生成一个线程Session对象
  3. Session对象生成Query对象或者Transaction对象。可通过 Session对象的 get()、 load()、save()、update()、delete()和saveOrUpdate()等方法对持久化对象 (Persistent Objects,PO)进行加载、保存、更新、删除等;也可利用 Query对象执行查询操作
  4. 如果没有异常,Transaction对象将提交这些数据到数据库中。如果有异常,则回滚

三、Hibernate的核心组件

基于Hibernate框架的项目开发的关键点就是使用Hibernate的核心类和接口,即核心组件。

Hibernate的核心组件位于业务层和持久层之间。

Hibernate除核心组件外还包括Hibernate配置文件(hibernate.cfg.xml)、映射文件(*.hbm.xml)和持久化对象

  1. Configuration

    Configuration负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动过程中,Configuration类的实例首先定位映射文件位置、读取配置,然后创建SessionFactory对象

  2. SessionFactory

    SessionFactroy负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象,这里用到了工厂模式。

    需要注意的是,SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory即可,当需要多次操作数据库时,可以为每个数据库指定一个SessionFactory线程对象。SessionFactroy是产生Session实例的工厂。

  3. Session

    Session负责执行PO(持久化对象)的操作,它用get()、load()、save() 、update()和delete()等方法来对PO进行加载、保存、更新及删除等操作。但需要注意的是,Session对象是非线程安全的。

    同时,Hibernate的Session不同于JSP应用中的HttpSession。这里使用的Session术语,其实指的是Hibernate中的Session。

  4. Transaction

    Transaction负责事务相关的操作,用来管理 Hibernate事务,它的主要方法有commit()和rollback() ,可以使用Session的 beginTransaction()方法生成。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。

  5. Query

    Query负责执行各种数据库查询。它可以使用HQL对PO进行查询操作。

    Query对象可以使用Session 的createQuery()方法生成。

  6. 配置文件

    Hibernate的配置文件主要用来配置数据库连接参数。例如,数据库的驱动程序、URL、用户名和密码、数据库方言等。

    它有两种格式: hibernate.cfg.xmlhibernate.properties。两者的配置内容基本相同,但前者比后者使用方便一些,如hibernate.cfg.xml可以在其<mapping≥子元素中定义用到的映射文件(xxx.hbm.xml)列表,而使用hibernate.properties时则需要在程序中以编码方式指明映射文件。

    一般情况下, hibernate.cfg.xml是 Hibernate5的默认配置文件。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <!--创建数据源-->
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/MySql</property>
        <property name="connection.username">数据库用户名</property>
        <property name="connection.password">数据库密码</property>
        <!-- SQL 方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <!-- 运行时是否显示SQL -->
        <property name="show_sql">true</property>
        <!-- 运行时是否格式化sql -->
        <property name="format_sql">true</property>
         <!-- 设置Hibernate的事务隔离级别 -->
        <property name="connection.isolation">2</property>
         <!-- 删除对象后,使其OID置为null -->
        <property name="use_identifier_rollback">true</property>
         <!-- 设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数 -->
        <property name="hibernate.jdbc.fetch size'">100</property>
          <!--设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
        <property name="jdbc.batch_size">30</property>
        <!-- 是否自动生成对象
     create 表示每次都重新建立所需对象
     update表示如果有就直接使用,如果修改则更新,如果没有则创建
     <property name="hbm2ddl.auto">update</property>
     -->
        <!--配置hibernate映射文件  -->
         <!--配置映射文件-->
        <mapping resource="com/yl/mapper/Dept.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>
  1. 映射文件

    映射文件(xxx.hbm.xml)用来把PO与数据库中的表,PO之间的关系与表之间的关系及PO的属性与表字段一一映射起来,它是 Hibernate的核心文件。

示例:User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
   <!-- 配置表与实体对象的关系 -->
   <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简单类名了. -->
<hibernate-mapping package="com.yl.mapper" >
    <!-- 
        class元素: 配置实体与表的对应关系的
        name: 完整类名(如果package已经配置包名,直接写类名即可)
        table:数据库表名
     -->
    <class name="User" table="yl_user" >
        <!-- id元素:配置主键映射的属性
            name: 填写主键对应属性名
            column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
            type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                    每个类型有三种填法: java类型|hibernate类型|数据库类型
            not-null(可选):配置该属性(列)是否不能为空. 默认值:false
            length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
        <id name="u_id"  >
            <!-- generator:主键生成策略 -->
            <generator class="native"></generator>
        </id>
        <!-- property元素:除id之外的普通属性映射
            name: 填写属性名
            column(可选): 填写列名
            type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                    每个类型有三种填法: java类型|hibernate类型|数据库类型
            not-null(可选):配置该属性(列)是否不能为空. 默认值:false
            length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
        <property name="u_name" column="u_name" >
            <!--  <column name="u_name" sql-type="varchar" ></column> -->
        </property>
        <property name="u_mobile" column="u_mobile" ></property>
    </class>
</hibernate-mapping>
  1. 持久化对象PO

    一般情况下, hibernate.cfg.xml是 Hibernate的默认配置文件。

    PO可以是普通的JavaBean,唯一特殊的是它们与Session相关联。

    PO在 Hibernate中存在3种状态:临时状态(Transient)、持久化状态(Persistent)和脱管状态(Detached)。当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这个JavaBean对象就称为临时对象(Transient Object);当它与一个Session 相关联时,就变成持久化对象;在Session被关闭的同时,对象也会脱离持久化状态,变成脱管对象(Detached Object),这时可以被应用程序的任何层自由使用。例如,可用作与表示层(V)打交道的数据传输对象。

四、Hibernate的优缺点

1、Hibernate框架的优点

  • 使开发更加面向对象化
  • 数据库移植性强:Hibernate支持多种数据库,可以通过配置轻松切换数据库,而无需修改应用程序代码
  • 提高开发效率:Hibernate提供了许多强大的特性和工具,减少开发人员的工作量,提高开发效率

2、Hibernate框架的缺点

  • Hibernate不适合处理复杂SQL,不能干预sql语句的生成。所以如果对sql语句的优化要求较高,那么不适合用Hibernate
  • Hibernate不适合处理用千万级数量的表。因为缓存机制会将大量数据放入缓存
  • 尽管Hibernate提供了缓存和懒加载等优化机制,但是不正确配置或者过度使用Hibernate的功能可能会导致性能问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值