目的和要求

  1. 了解Hibernate的基本工作原理;

  2. 理解Hibernate的配置;

  3. 掌握简单映射文件的编写;

数据库建表

已知表结构如下:

Tbl_class 班级信息表

序 号列 名数据类型长 度小数位主 键字段说明
1Class_idint40班级编号
2Class_Namevarchar800班级名称

Tbl_student 学生信息表

序 号列 名数据类型长 度小数位主 键字段说明
1Stu_novarchar20学号
2Class_idint40班级编号
3Stu_Namevarchar800姓名
4Stu_sexvarchar20性别

根据表结构可以得出建表语句

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
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for Tbl_class
-- ----------------------------
DROP TABLE IF EXISTS `Tbl_class`;
CREATE TABLE `Tbl_class` (
`Class_id` int(4) NOT NULL COMMENT '班级编号',
`Class_Name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '班级名称',
PRIMARY KEY (`Class_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for Tbl_student
-- ----------------------------
DROP TABLE IF EXISTS `Tbl_student`;
CREATE TABLE `Tbl_student` (
`Stu_no` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号',
`Class_id` int(4) NULL DEFAULT NULL COMMENT '班级编号',
`Stu_Name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`Stu_sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`Stu_no`) USING BTREE,
INDEX `Stu_Class`(`Class_id`) USING BTREE,
CONSTRAINT `Stu_Class` FOREIGN KEY (`Class_id`) REFERENCES `Tbl_class` (`Class_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

代码编写

建立配置工程

newproject

导入 MySql 的 jar 包

java 工程引入 jar 包跟 eclipse 有点不同,选择工具栏上 File —> Project Structure —> Libraries —> 点击 + —> Attach Files or Directories —> 选择自己需要的 jar 包:

addmysqljar

自动生成配置文件

首先需要配置并连接数据库,如下图所示使用 idea 连接数据库,根据表结构自动生成建立班级和学生的类,并编写 hbm 文件建立类和数据库表的映射:

adddb

生成的文件目录如下:

genresult

生成的代码如下:

  • 生成的 hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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>
<class name="xyz.zhzh.classes.model.TblClass" table="Tbl_class" schema="class">
<id name="classId" column="Class_id"/>
<property name="className" column="Class_Name"/>
</class>
<class name="xyz.zhzh.classes.model.TblStudent" table="Tbl_student" schema="class">
<id name="stuNo" column="Stu_no"/>
<property name="stuName" column="Stu_Name"/>
<property name="stuSex" column="Stu_sex"/>
</class>
</hibernate-mapping>
  • 生成的 TblClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package xyz.zhzh.classes.model;

import java.util.Objects;

public class TblClass {
private int classId;
private String className;

public int getClassId() {
return classId;
}

public void setClassId(int classId) {
this.classId = classId;
}

public String getClassName() {
return className;
}

public void setClassName(String className) {
this.className = className;
}
}
  • 生成的 TblStudent
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
package xyz.zhzh.classes.model;

import java.util.Objects;

public class TblStudent {
private String stuNo;
private String stuName;
private String stuSex;

public String getStuNo() {
return stuNo;
}

public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}

public String getStuName() {
return stuName;
}

public void setStuName(String stuName) {
this.stuName = stuName;
}

public String getStuSex() {
return stuSex;
}

public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
}

Hibernate 主配置文件编写

src 下新建 hibernate.cfg.xml,然后写入以下内容:

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>
<!-- hibernate.connection.driver_class : 连接数据库的驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- hibernate.connection.username : 连接数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- hibernate.connection.password : 连接数据库的密码 -->
<property name="hibernate.connection.password">******</property>
<!-- hibernate.connection.url : 连接数据库的地址,路径 -->
<property name="hibernate.connection.url">jdbc:mysql://******:3306/class?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false</property>
<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- format_sql: 打印sql语句前,会将sql语句先格式化 -->
<property name="format_sql">true</property>
<!-- 数据库方言配置 org.hibernate.dialect.MySQLDialect (选择最短的)-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate.connection.autocommit: 事务自动提交 -->
<property name="hibernate.connection.autocommit">true</property>
<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 引入ORM 映射文件 填写src之后的路径 -->
<mapping resource="xyz/zhzh/classes/hbm.xml"/>
</session-factory>
</hibernate-configuration>

编写 Hibernate 类测试映射关系

新建 xyz.zhzh.classes.util 包,然后新建 HibernateUtil.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
package xyz.zhzh.classes.util;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import xyz.zhzh.classes.model.*;

public class HibernateUtil {
public static SessionFactory sessionFactory
= new Configuration().configure().buildSessionFactory();
public static Session getSession(){
return sessionFactory.openSession();
}
public static void main(String[] args){
Session session=getSession();
Transaction tx = session.beginTransaction();
TblClass tblClass = new TblClass();
tblClass.setClassId(0);
tblClass.setClassName("数据库设计与开发");
session.save(tblClass);
tx.commit();
session.close();
System.exit(0);
}
}

可以看到终端打印出 sql 语句,并且数据库中已经存入相应信息,视为配置映射文件没有问题。

修改映射关系

由于学生和班级之间为多对一的关系,所以需要在学生类增加一个班级的属性,班级类中增加一个 List 的学生属性,并且在 hbm.xml 配置文件中增加该映射关系。

首先在 TblStudent 中添加:

1
2
3
4
5
6
7
8
9
private TblClass studentClass;

public TblClass getStudentClass() {
return studentClass;
}

public void setStudentClass(TblClass studentClass) {
this.studentClass = studentClass;
}

TblClass 中添加:

1
2
3
4
5
6
7
8
9
private Set<TblStudent> students;

public Set<TblStudent> getStudents() {
return students;
}

public void setStudents(Set<TblStudent> students) {
this.students = students;
}

hbm.xml 中两个类里对应添加以下映射关系

1
2
3
4
<set name="students">
<key column="Class_id"/>
<one-to-many class="xyz.zhzh.classes.model.TblStudent"/>
</set>
1
<many-to-one name="studentClass" class="xyz.zhzh.classes.model.TblClass" column="Class_id"/>

至此配置完成,可以正式开始开发