浅谈对象关系映射框架Hibernate

网友投稿 678 2022-05-30

一、什么是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

2、核心配置文件

核心配置文件路径必须在src目录下

核心配置文件名称必须为hibernate.cfg.xml

hibernate在工作时,会直接加载核心配置文件,不会直接加载映射关系配置文件

com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/class1912? serverTimezone=GMT&useSSL=false&characterEncoding=utf8 root chendikai true true org.hibernate.dialect.MySQL5Dialect update

六、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)

浅谈对象关系映射框架Hibernate

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层...

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

JAR Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL数据库界面化工具 - Navicat的常用功能
下一篇:GaussDB(DWS)《ROACH小课堂Ⅰ测试方法篇之交互测试》
相关文章