持久层框架——Hibernate

开源的对象/关系映射框架–Hibernate


Hibernate简介

Hibernate官网
Hibernate是一个开源的对象/关系映射框架,或者说Hibernate是一个流行的持久层的框架,Hibernate对JDBC操作数据库的代码进行了轻量的封装,使得开发人员能够更自然地使用面向对象的方式操作数据库,大大简化了代码的编写。


Hibernate框架搭建

Hibernate框架的搭建大致分为六个步骤:

1、导入Jar包
2、创建数据库、数据表
3、创建实体
4、配置对象与表的映射
5、配置主配置文件
6、测试

搭建Hibernate框架所用到的必须的jar包,位于hibernate-release-5.3.1.Final\lib\required

jar


Hibernate映射文件

实体类是普通(POJO)的Java类,并不具备持久化操作的能力,而映射文件能够将实体类中的属性映射到数据库中相应的的表字段中。Hibernate的映射文件通常以xxx.hbm.xml的形式命名,其中xxx指的是实体类名称,并且为了方便维护,映射文件通常放置在与实体类相同的目录下。例如将一个User实体类映射到数据库中的user表中:

实体类User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.my.domain;

import java.util.Date;

public class User {

private String uid;
private String username;
private String password;
private String email;
private String telephone;
private Date birthday;

public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
创建user表
1
2
3
4
5
6
7
8
9
CREATE TABLE `user` (
`uid` varchar(32) NOT NULL,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`email` varchar(30) DEFAULT NULL,
`telephone` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据表与实体类都创建好之后便可以进行映射了:

User.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.my.domain">
<class name="com.my.domain.User" table="user">
<id name="uid" column="uid">
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="email" column="email"></property>
<property name="telephone" column="telephone"></property>
<property name="birthday" column="birthday"></property>
</class>
</hibernate-mapping>

在上面的User.hbm.xml文件中,已经将实体类User映射到了数据库中的user表中,下面来看看映射文件中各个元素以及元素里面的属性的含义:

各个元素以及元素里面的属性的含义:
hibernate-mapping : 映射文件的根元素,所有的都在中进行配置
    package属性:配置包名,如果配置了此属性,在元素内部凡是要填写完整类名的属性,可以直接写类名
class : 定义与数据表进行映射的实体类
    name属性:实体类名称
    table属性:与实体类进行映射的表名称
id : 配置实体类中唯一属性与数据表的主键进行映射
    name属性:实体类中用于与数据表主键进行映射的属性
    column属性:数据表主键
generator : 指定主键的生成策略
    class属性:主键的生成策略(7个):
        identity:主键自增。由数据库来维护主键,录入时不需要指定主键
        sequence:Oracle中的主键生成策略
        increment:主键自增,由Hibernate维护,每次插入前先查询表中的id值,然后+1
        Hilo:高低位算法,主键自增,由Hibernate维护
        native:Hilo+sequence+identity,自动三选一策略
        UUID:产生随机字符串作为主键,主键类型必须为String
        assigned:自然主键生成策略,hibernate不会管理主键,由开发人员录入
property : 除了主键数属性之外的普通属性的映射
    name属性:实体类中普通属性名称
    column属性:数据表中对应的列名称

以上只是映射文件中的部分元素及属性的含义。


Hibernate主配置文件

Hibernate的映射文件负责实体类属性与数据库表字段之间的映射,而Hibernate主配置文件则负责配置连接持久层以及导入映射文件,Hibernate主配置文件有两种形式,一种是资源文件,即hibernate.properties,另一种是xml文件,hibernate.cfg.xml,两种文件的形式的主配置文件是等价的,但通常使用hibernate.cfg.xml来作为hibernate的主配置文件,因为xml格式的文件更容易修改。hibernate的主配置文件一般放置在src目录下。下面是一些常用的配置信息:

hibernate主配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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>
<session-factory>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- 数据库URL -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate?useSSL=false&amp;serverTimezone=GMT%2B8</property>
<!-- 数据库连接名 -->
<property name="hibernate.connection.username">mackvord</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">12345678</property>
<!-- 指定数据库方言,MySQL5.x之后为MySQL5Dialect,5.x之前为MySQLDialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 配置hibernate生成的SQL语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 配置将打印到控制台的SQL语句进行格式化(语法缩进),便于阅读 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动建表,如果表已经存在,则不再自动生成,如果表有改动则自动更新(不会删除原有的数据)-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 指定hibernate操作数据库时的隔离级别,有四种选择,1表示读未提交;2表示读已提交;4表示可重复读;8表示串行化 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 导入映射文件 -->
<mapping resource="com/my/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>

Hibernate作为当下最为流行的持久层框架之一,其所涉及到的知识远远不止以上这些,关于Hibernate其他的一些学习研究,以后有时间在继续更新。


如果您觉得我的文章对您有帮助,请随意赞赏,您的支持将鼓励我继续创作!
0%