浅谈对象关系映射框架Hibernate

举报
运气男孩 发表于 2022/03/01 18:00:09 2022/03/01
【摘要】  一、什么是HibernateHibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,它可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet...

 一、什么是Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,它可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。

ORM(对象关系映射)思想,所谓的ORM就是利用描述对象和数据库表之间的映射元数据,自动把Java应用程序的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库的操作,可以把ORM理解为关系型数据库和对象的一个纽带,开发人员只需要关注纽带一端映射的对象即可。 

二、Hibernate优势

1. Hibernate对JDBC访问数据库的代码做了一个轻量级的封装,大大简化了数据访问层的繁琐操作,减少代码的复杂度,和减少内存消耗,加快了运行速度
2. Hibernate是一个基于JDBC的主流框架,是一个优秀ORM实现,很大程度上简化了DAO层操作
3. Hibernate性能较好,灵活性较高,它可以支持一对一、一对多、多对多
4. 可扩展性强,当本身功能不够时,可以自行编码进行扩展 

三、Hibernate下载

1、下载Hibernate框架

点击上方进入官网下载,目前最新开发版本为6.0,建议先下载5.6稳定版进行使用,新版本可能存在不确定因素。

点击进去后选择zip archive即可下载

2、hibernate解压后的目录

四、创建Hibernate项目

1、创建工程

  • 修改项目文件编码格式

在打开IDEA时点击configure 点setting 然后找到file Encodings 将编码全改成UTF-8 然后打勾 

  • 创建普通的java工程项目

2、导入jar包
在项目目录下新建lib目录,将下面的jar包导入lib目录
导入hibernate核心jar包 

  • 导入数据库驱动jar包

  • 导入日志包

创建一个包,把这些jar包放进去,并将全部应用到整个项目依赖库 当前面出现的小箭头 就说明成功了

3、创建实体类

package com.hbnu.pojo;

public class User {
    //hibernate 要求实体类必须要有一个唯一属性值
    private int uid; //id号

    private String username;//用户名

    private  String address;//地址

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

五、Hibernate配置文件

1、映射关系配置文件

映射关系配置文件路径没有限制,官方建议将映射配置文件和实体类放在同一路径下
映射关系配置文件名称没有限制,但后缀为.xml,官方建议映射关系配置文件命名为:实体类名.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">
<hibernate-mapping>
<!-- 配置对象和数据库表之间的映射关系
name:实体类的全路径名
table:数据库表的名称
-->
<class name="com.hbnu.pojo.User" table="tb_user">
<!-- 配置主键映射关系
name:实体类中唯一的属性名
column:数据库表中主键名称,column属性可以省略,如果省略,则自动生成的数据
库表主键名称和实体类名称一致
-->
<id name="uid" column="id">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 配置其他属性的映射关系 -->
<property name="username" column="name"/>
<property name="address" column="addr"></property>
</class>
</hibernate-mapping>

2、核心配置文件

核心配置文件路径必须在src目录下
核心配置文件名称必须为hibernate.cfg.xml
hibernate在工作时,会直接加载核心配置文件,不会直接加载映射关系配置文件

<?xml version="1.0" encoding="utf-8" ?>
<!-- 引入核心配置文件头信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 配置hibernate核心配置文件 -->
<session-factory>
<!-- 1、数据库信息 必需 -->
<property
name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</prope
rty>
<property
name="hibernate.connection.url">jdbc:mysql://localhost:3306/class1912?
serverTimezone=GMT&amp;useSSL=false&amp;characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property
name="hibernate.connection.password">chendikai</property>
<!-- 2、hibernate信息 非必需 -->
<!-- 在控制台输出hibernate底层生成的SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化hibernate底层生成的SQL语句 -->
<property name="format_sql">true</property>
<!-- 数据库方言 -->
<property
name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- hibernate自动创建数据库表,如果表已经存在,则更新表,如果不存在,则创
建表格 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3、引用hibernate映射关系配置文件 必需 -->
<mapping resource="com/hbnu/config/user.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

六、hibernate运行测试

package test;

import com.hbnu.pojo.User;
import com.hbnu.util.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class HibernateTest {
    /**
     * 添加数据到表中
     */
    @Test
    public void insertData(){
        //1. 加载hibernate配置文件(解析核心配置文件)
        Configuration configure = new Configuration().configure();

        //2. 根据配置对象configure构建会话工厂
        SessionFactory sessionFactory = configure.buildSessionFactory();

        //3. 根据会话工厂创建会话对象
        Session session = sessionFactory.openSession();

        //4. 通过调用会话对象的相关方法执行数据库的CRUD操作
        User user = new User();
        user.setUsername("123456");
        user.setAddress("huangshi");
        session.save(user); //操作Java中的对象,保存对象中的数据到数据库表中

        //5. 关闭会话和会话工厂
        session.close();
        sessionFactory.close();
    }

七、Hibernate执行过程

1. 通过Configuration对象加载hibernate核心配置文件,间接加载映射关系配置文件
2. 通过Configuration对象构建会话工厂SessionFactory
3. 通过会话工厂SessionFactory对象创建会话对象Session
4. 通过调用会话对象Session的相关方法执行数据库的CRUD操作
5. 关闭会话对象和会话工厂

核心相关API

Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
1. session对象类似于JDBC中的Connection
2. session对象有操作数据库的相关方法
添加 save()
修改 update()
删除 delete()
根据主键id查询 get(id)
3. session是单线程的
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。sessionFactory对象的创建是通过Configruation对象,根据配置文件的配置信息创建会话工厂,同时在创建会话工厂的过程中自动创建数据库表,这个过程是比较耗资源的。在hibernate项目中,建议一个项目只创建一次SessionFactory对象,可以通过工具类来实现
package com.hbnu.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
private static Configuration configuration;
private static SessionFactory sessionFactory;
static {
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

九、主键生成策略

increment
适用于long、short或int类型主键,由Hibernate提供自动递增的方式生成唯一标识符,每次增量为1。只有当没有其他进程向同一张表中插入数据时才可以使用,不能再多线程环境下使用
identity
适用于long、short或int类型主键,采用底层数据库本身提供的主键生成标识符。在DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL数据库中可以使用该生成器,该生成器要求在数据库中把主键定义成为自增类型。Oracle没有自动增长
sequence
适用于long、short或int类型主键,Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence,MySQL这种不支持sequence 
native(掌握)
根据底层数据库对自动生成标识符的能力来选择identity、sequence、hilo三种生成器中的一种,适合跨数据库平台开发
uuid(掌握)
Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,其UUID被编码为一个长度为32位的十六进制字符串。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便,推荐使用。
assigned
由Java程序负责生成标识符,Hibernate不管理主键,用户手动设置主键的值。如果不指定id元素的generator属性,则默认使用该主键生成策略

十、对象的CRUD


1、查询数据库 
 /**
     *
     *查询数据库表中的信息
     */
    @Test
    public void queryData(){
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();

        Session session =sessionFactory.openSession();

        //调用seesion中的方法查询数据库表
        User user = session.get(User.class,1);
        System.out.println(user);

        session.close();;
        sessionFactory.close();
    }

可以看出hibernate此时的优势就是自动生成sql语句,查询到了数据库里的数据

2、修改数据库

先查询要修改的数据,再修改数据,只要我们改变数据库中的数据,则必须添加事务

/**
     *
     * 修改数据库表中的信息
     */
    @Test
    public void updateData(){
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();

        Session session =sessionFactory.openSession();

        Transaction transaction =session.beginTransaction();

        //先查询数据,再修改数据  只要我们对数据库中的数据改变  则必须添加事务
        User user = session.get(User.class, 1);
        user.setAddress("wuhan");
        user.setUsername("yang");
        session.update(user);
        transaction.commit();//提交事务
        session.close();;
        sessionFactory.close();
    }

3.删除数据库的数据

 /**
     * 删除数据表中信息
     */
    @Test
    public void deleteData(){
        SessionFactory sessionFactory =HibernateUtils.getSessionFactory();
        Session session =sessionFactory.openSession();

        Transaction transaction =session.beginTransaction();
        User user = session.get(User.class,1);
        session.delete(user);
        transaction.commit();
        //关闭资源
        sessionFactory.close();
        session.close();
    }

总结

Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC中的数据持久层->在编写程序中的DAO层...

感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。