Hibernate框架教程(史上最全图文详解)

Hibernate框架教程(史上最全图文详解)-mikechen

Hibernate定义

Hibernate是一个ORM框架,Hibernate实现了Java对象与关系数据库记录的映射关系,对JDBC做了轻量级的封装,简化了数据访问层编码。

 

Hibernate作用

Hibernate作用大致如下,主要分为3点:

1)移植性:对于不同的数据库,开发者只需要使用相同的数据操作即可;

2)效率高:Hibernate提供了大量的封装(这也是它最大的缺点),开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率;

3)缓存机制:Hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中。

 

Hibernate的核心组件

Hibernate核心组件,如下图所示:

Hibernate框架教程(史上最全图文详解)-mikechen

1.Hiberbate配置文件

主要用来配置数据库连接参数,它有两种格式:hibernate.properties和hibernate.cfg.xml,通常使用后者。

2.持久化对象(PO)

在Hibernate应用中,一个数据表对应一个持久化对象PO。

3.映射文件

用来把PO与数据库中的数据表映射起来,是hibernate的核心文件。

4.Configuration类

用来读取Hibernate配置文件和映射文件,并创建SessionFcatory对象。

5.SessionFactory接口

产生Sessio实例的工厂,是Hibernate的容器

6.Session接口

用来操作PO,它有get() save() update() delete()等方法,用来对PO进行加载、保存、更新及删除等操作,是hibernate的核心接口。

7.Transaction接口

用来管理Hibernate事物,主要方法有commit()和rollback(),可从Session的beginTransaction()方法生成。

8.Query接口

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

 

Hibernate的工作原理

Hibernate工作原理及流程,如下图所示:

Hibernate框架教程(史上最全图文详解)-mikechen

主要分为如下9个步骤:

1)读取并解析配置文件;

读取并解析hibernate.cfg.xml配置文件

2)读取并解析映射信息:hibernate.cfg.xml中的读取并解析映射信息;

3)创建SessionFactory;

SessionFactory sf = config.buildSessionFactory();

4)打开Sesssion;

Session session = sf.openSession();

5)创建并启动事务;

Transaction tx = session.beginTransaction();

6)操作数据库,并持久化操作;

persistent operate

7)提交事务;

tx.commit();

8)关闭Session;

9)关闭SesstionFactory

 

Hibernate配置文件

Hibernate 配置文件主要分为 2 种:核心配置文件(hibernate.cfg.xml)和映射文件(类名.hbm.xml)。

1.hibernate.cfg.xml

hibernate.cfg.xml主要用于:配置数据库连接、事务管理、Hibernate 本身的配置信息。

如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
 <!-- 配置连接数据库的基本信息 -->
 <property name="connection.username">root</property>
 <property name="connection.password">123456</property>
 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="connection.url">jdbc:mysql://localhost:3306/librarydemo?useUnicode=true&characterEncoding=UTF-8</property>
 <!-- 设置C3P0 -->
 <!-- 当数据库连接资源不够时,重新申请的连接数 -->
 <property name="hibernate.c3p0.acquire_increment">10</property>
 <!-- 设置释放资源线程执行的间隔时间 -->
 <property name="hibernate.c3p0.idle_test_period">10000</property>
 <!-- 设置超时时间 -->
 <property name="hibernate.c3p0.timeout">5000</property>
 <!-- 数据库连接池最大的连接数 -->
 <property name="hibernate.c3p0.max_size">30</property>
 <!-- 设置statement的数量 -->
 <property name="hibernate.c3p0.max_statements">10</property>
 <!-- 数据连接池最小的连接数 -->
 <property name="hibernate.c3p0.min_size">5</property>
 <!-- 配置Hibernate的基本信息 -->
 <!-- hibernate 所使用的数据库方言 -->
 <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 
 <!-- 执行操作时是否在控制台打印 SQL -->
 <property name="show_sql">true</property>
 <!-- 是否对 SQL 进行格式化 -->
 <property name="format_sql">true</property>
 <!-- 指定是否自动生成数据库表 -->
 <property name="hbm2ddl.auto">update</property>
 <!-- 添加实体关系映射文件 -->
 <mapping resource="com/hzit/entity/Customer.hbm.xml"/>
 <mapping resource="com/hzit/entity/Orders.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

 

2.类名.hbm.xml

类名.hbm.xml就是系统中每一个类与其对应的数据库表之间的关联信息。

如下User表所示:

Hibernate框架教程(史上最全图文详解)-mikechen

 

Hibernate 缓存机制

1)一级缓存(Session缓存)

Hibenate中一级缓存,也叫做session的缓存, 只在session范围有效,Session关闭一级缓存失效。

 

2) 二级缓存(SessionFactory缓存)

二级缓存是基于应用程序的缓存,所有的Session都可以使用,Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架。

如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可,如下所示:

<property name="hibernate.cache.use_second_level_cache">true</property>
 
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

支持配置第三方的缓存,比如:EhCache。

 

Hibernate使用实例

Hibernate增删改查实例,如下所示:

1.创建Hibernate工程

Hibernate整体工程结构,如下图所示:

Hibernate框架教程(史上最全图文详解)-mikechen

下面主要会涉及建表、以及生成User实体类,以及配置文件,以及增删改查等方法,下面一一详解。

 

2.创建User表

CREATE DATABASE hibernate;
USE hibernate;
CREATE TABLE `user` (
  `id` int(32) PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(20),
)

 

3.User实体类

生成User实体类,如下所示:

package com.mikechen.domain;

public class User {
    private Integer id; // 唯一标识id
    private String name; // 姓名

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

 

 

4.hibernate配置文件

hibernate.cfg.xml主要用于:配置数据库连接、事务管理、Hibernate 本身的配置信息。

在 src 目录下创建一个名称为 hibernate.cfg.xml 的文件,详细的配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 指定方言 -->
        <property name="dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
        <!-- 链接数据库url -->
        <property name="connection.url">
              <![CDATA[jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf-8]]>
        </property>
        <!-- 连接数据库的用户名 -->
        <property name="connection.username">
            root
        </property>
        <!-- 数据库的密码 -->
        <property name="connection.password">
            123456
        </property>
        <!-- 数据库驱动 -->
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <!-- 显示sql语句 -->
        <property name="show_sql">
            true
        </property>
        <!-- 格式化sql语句 -->
        <property name="format_sql">true</property>
        <!-- 映射文件配置 -->
        <mapping resource="com/mikechen/domain/User.hbm.xml" />
    </session-factory>
</hibernate-configuration>

 

5.user.hbm.xml 

建立刚才新建的User实体类与表的对应关系,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name代表的是类名,table代表的是表名 -->
    <class name="com.mikechen.domain.User" table="user">
        <!-- name代表的是User类中的id属性,column代表的是user表中的主键id -->
        <id name="id" column="id">
            <!-- 主键生成策略 -->
            <generator class="native" />
        </id>
        <!-- 其他属性使用property标签映射 -->
        <property name="name" column="name" type="java.lang.String" />
    </class>
</hibernate-mapping>

 

6.增删改查测试

前期配置完成后,现在开始通过hibernate增删改查。

1)增加数据

@Test
    public void testInsert() {
        // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
        Configuration config = new Configuration().configure();
        // 2.获取SessionFactory
        SessionFactory sessionFactory = config.buildSessionFactory();
        // 3.得到一个Session
        Session session = sessionFactory.openSession();
        // 4.开启事务
        Transaction transaction = session.beginTransaction();
        // 5.执行持久化操作
        User user = new User();
        user.setName("mikechen");
        // 将对象保存到表中
        session.save(user);
        // 6.提交事务
        transaction.commit();
        // 7.关闭资源
        session.close();
        sessionFactory.close();
    }

 

2)查询数据

@Test
public void queryTest() {
    // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
    Configuration config = new Configuration().configure();
    // 2.获取SessionFactory
    SessionFactory sessionFactory = config.buildSessionFactory();
    // 3.得到一个Session
    Session session = sessionFactory.openSession();
    // 4.开启事务
    Transaction transaction = session.beginTransaction();
    // 5.执行持久化操作
    User user = (User) session.get(User.class, 1);
    System.out.println(user.getId() + "" + user.getName() );
    // 6.提交事务
    transaction.commit();
    // 7.关闭资源
    session.close();
    sessionFactory.close();
}

 

3)修改数据

@Test
public void testUpdate() {
    // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
    Configuration config = new Configuration().configure();
    // 2.获取SessionFactory
    SessionFactory sessionFactory = config.buildSessionFactory();
    // 3.得到一个Session
    Session session = sessionFactory.openSession();
    // 4.开启事务
    Transaction transaction = session.beginTransaction();
    // 5.执行持久化操作
    User user = new User();
    user.setName("mikechen");
    // 更新数据
    session.update(user);
    // 6.提交事务
    transaction.commit();
    // 7.关闭资源
    session.close();
    sessionFactory.close();
}

 

4)删除数据

@Test
public void deleteByIdTest() {
    // 1.创建Configuration对象并加载hibernate.cfg.xml配置文件
    Configuration config = new Configuration().configure();
    // 2.获取SessionFactory
    SessionFactory sessionFactory = config.buildSessionFactory();
    // 3.得到一个Session
    Session session = sessionFactory.openSession();
    // 4.开启事务
    Transaction transaction = session.beginTransaction();
    // 5.执行持久化操作
    User user = (User) session.get(User.class, 1);
    session.delete(user);
    // 6.提交事务
    transaction.commit();
    // 7.关闭资源
    session.close();
    sessionFactory.close();
}

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法