浅谈对象关系映射框架Hibernate
一、什么是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&useSSL=false&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
2. session对象有操作数据库的相关方法
添加 save()
修改 update()
删除 delete()
根据主键id查询 get(id)
3. session是单线程的
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;
}
}
九、主键生成策略
适用于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
根据底层数据库对自动生成标识符的能力来选择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层...
感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
- 点赞
- 收藏
- 关注作者
评论(0)