目录
5、将实体类关系映射文件注册到 Hibernate.cfg.xml 配置文件中
3.1、编写 Customer.hbm.xml 关系映射文件
3.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中
3.4、编写测试类调用 Hibernate API 保存数据
4.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中
4.4、编写测试类调用 Hibernate API 保存数据
一、Hibernate简介
主流 ORM 框架 Object Relation Mapping 对象关系映射,将⾯向对象映射成⾯向关系。
二、如何使用
1、导⼊相关依赖
2、创建 hibernate.cfg.xml 配置⽂件
3、创建实体类
4、创建实体类-关系映射⽂件
5、调⽤ Hibernate API 完成操作
三、具体操作
1、创建maven工程
导入pom依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.32.Final</version>
</dependency>
</dependencies>
2、添加 hibernate.cfg.xml 文件
在resources目录下创建 hibernate.cfg.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置数据源 -->
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/studydb?useUnicode=true&characterEncoding=UTF-8</property>
<!-- 配置数据库连接池(C3P0) -->
<property name="hibernate.c3p0.acquire_increment">10</property>
<property name="hibernate.c3p0.idle_test_period">10000</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_statements">10</property>
<!-- 配置sql语句规范为 MySQL数据库 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 是否自动生成数据表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 注意: 这里要修改为自己实体类所在的包名(路径) -->
<mapping resource="com/zhijia/entity/Customer.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
核心配置:session-factory
什么是SessionFactory?
指的是负责创建Session的核心接口,它充当数据存储源的代理,并负责创建
Session对象。
Hibernate的核心接口
SessionFactory接口:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
3、创建实体类
创建实体类(需要在数据库创建实体类对应的表)
import lombok.Data;
import java.util.Set;
@Data
public class Customer {
private Integer id;
private String name;
private Set<Orders> orders;
}
import lombok.Data;
@Data
public class Orders {
private Integer id;
private String name;
private Customer customer;
}
4、创建实体关系映射文件
在实体类同级目录下创建 实体类映射文件(实体类名.hbm.xml)
创建Customer实体类对应的关系映射文件(Customer.hbm.xml)
Customer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 注意:这里要修改为自己实体类所在的包名(路径) -->
<class name="com.zhijia.entity.Customer" table="customer">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
</class>
</hibernate-mapping>
Customer实体类对应的表
5、将实体类关系映射文件注册到 Hibernate.cfg.xml 配置文件中
<!-- 注册实体关系映射⽂件 -->
<mapping resource="com/zhijia/entity/Customer.hbm.xml"></mapping>
这里的resource属性的值要改成你本地映射文件对应的路径
6、使用 Hibernate API 完成数据操作
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Test {
public static void main(String[] args) {
//创建Configuration
Configuration configuration = new Configuration().configure();
//获取SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获取Session
Session session = sessionFactory.openSession();
Customer customer = new Customer();
customer.setName("路飞");
//开始事务
Transaction transaction = session.beginTransaction();
//插入数据
session.save(customer);
//提交事务
transaction.commit();
}
}
7、pom.xml 文件中需要配置 resource
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
8、查看执行结果
无报错则运行成功,查看数据库成功添加一条数据。
四、Hibernate 级联操作
1、一对多关系
客户和订单:每个客户可以购买多个产品,⽣成多个订单,但是一个订单只能属于一个客户,所以客户 是一,订单是多。
数据库中⼀的⼀⽅是主表,多的⼀⽅时候从表,通过主外键关系来维护。
面向对象中的体现
一个客户 (Customer) 可以拥有多个 订单 (Orders)
import lombok.Data;
import java.util.Set;
@Data
public class Customer {
private Integer id;
private String name;
private Set<Orders> orders;
}
一个订单 (Orders) 只能属于一个客户 (Customer)
import lombok.Data;
@Data
public class Orders {
private Integer id;
private String name;
private Customer customer;
}
2、多对多关系
学⽣选课:⼀⻔课程可以被多个学⽣选择,⼀个学⽣可以选择多⻔课程,学⽣是多,课程也是多。 数据库中是通过两个⼀对多关系来维护的,学⽣和课程都是主表,额外增加⼀张中间表作为从表,两张 主表和中间表都是⼀对多关系。
学生表
课程表
学生和课程关联关系表
⾯向对象中的体现
import lombok.Data;
import java.util.Set;
@Data
public class Student {
private Integer id;
private String name;
private Set<Course> courses;
}
import lombok.Data;
import java.util.Set;
@Data
public class Course {
private Integer id;
private String name;
private Set<Student> students;
}
3、Hibernate 实现一对多
3.1、编写 Customer.hbm.xml 关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 这里要修改为自己实体类所在的包名(路径) -->
<class name="com.zhijia.entity.Customer" table="customer">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<set name="orders" table="orders">
<key column="cid"></key>
<one-to-many class="com.zhijia.entity.Orders"></one-to-many>
</set>
</class>
</hibernate-mapping>
- set 标签来配置实体类中的集合属性 orders
- name 实体类属性名
- table 表名
- key 外键
- one-to-many 与集合泛型的实体类对应关系
3.2、编写 Orders.hbm.xml 关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 这里要修改为自己实体类所在的包名(路径) -->
<class name="com.zhijia.entity.Orders" table="orders">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<many-to-one name="customer" class="com.zhijia.entity.Customer" column="cid"></many-to-one>
</class>
</hibernate-mapping>
- many-to-one 配置实体类对应的对象属性关系
- name 属性名
- class 属性对应的类
- column 外键名
3.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中
<!-- 注册实体关系映射⽂件 -->
<mapping resource="com/zhijia/entity/Customer.hbm.xml"></mapping>
<mapping resource="com/zhijia/entity/Orders.hbm.xml"></mapping>
这里的resource属性的值要改成你本地映射文件对应的路径
3.4、编写测试类调用 Hibernate API 保存数据
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Test2 {
public static void main(String[] args) {
//创建 Configuration
Configuration configuration = new Configuration().configure();
//获取 SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获取 Session
Session session = sessionFactory.openSession();
//创建 Customer
Customer customer = new Customer();
customer.setName("张三");
//创建 Orders
Orders orders = new Orders();
orders.setName("订单1");
//建⽴关联关系
orders.setCustomer(customer);
//开启事务
Transaction transaction = session.beginTransaction();
//保存 customer
session.save(customer);
//保存 orders
session.save(orders);
//提交事务
transaction.commit();
//关闭session
session.close();
}
}
3.5、查看执行结果
没有任何报错表示插入数据成功,查看数据表。
查看数据库成功插入关联数据,可以看到 订单1 属于 张三 的
4、Hibernate 实现多对多
4.1、编写 Student.hbm.xml 关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 这里要修改为自己实体类所在的包名(路径) -->
<class name="com.zhijia.entity.Student" table="student">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<set name="courses" table="student_course">
<key column="sid"></key>
<many-to-many class="com.zhijia.entity.Course" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>
4.2、编写 Course.hbm.xml 关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 注意:这里要修改为自己实体类所在的包名(路径) -->
<class name="com.zhijia.entity.Course" table="course">
<id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<set name="students" table="student_course">
<key column="cid"></key>
<many-to-many class="com.zhijia.entity.Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>
- name:实体类对应的集合属性名
- table:中间表名
- key:该实体类在中间表的外键名
- many-to-many:与集合泛型的实体类对应关系
- column:属性的集合泛型实体类与中间表的外键字段名
4.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中
<!-- 注册实体关系映射⽂件 -->
<mapping resource="com/zhijia/entity/Course.hbm.xml"></mapping>
<mapping resource="com/zhijia/entity/Student.hbm.xml"></mapping>
4.4、编写测试类调用 Hibernate API 保存数据
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import java.util.HashSet;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
//创建 Configuration
Configuration configuration = new Configuration().configure();
//获取 SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获取 Session
Session session = sessionFactory.openSession();
//创建课程对象
Course course = new Course();
course.setName("Java");
//创建学生
Student student = new Student();
student.setName("赵六");
//创建课程集合
Set<Course> courseList = new HashSet<Course>();
courseList.add(course);
//学生和课程简历关系(赵六学生选了Java课程)
student.setCourses(courseList);
//开启食物
Transaction transaction = session.beginTransaction();
//保存课程信息
session.save(course);
//保存学生信息
session.save(student);
//提交事务
transaction.commit();
//关闭session
session.close();
}
}
4.5、查看执行结果
没有任何报错表示插入数据成功,查看数据表。
到此,我们的 Hibernate快速入门 篇就结束了...
感谢大家的阅读!