一、如何使用hibernate:
详解:
1、创建maven工程,并修改pom.xml添加依赖。
添加mysql-connector-java、hibernate-core、lombok
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
添加好后更新maven,会看到如下图:
2、创建hibernate配置文件--必须命名为hibernate.cfg.xml
在resource中添加file,命名为hibernate.cfg.xml
先添加一个头,这个可以直接复制:
<?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-configuration>
核心配置:session-factory
区分SessionFactory和session-factory
- SessionFactory是接口:针对单个数据库映射进过编译的内存镜像文件,简单理解为将数据库转为一个Java可以识别的镜像文件。构建SessionFactory非常耗费资源,所以通常一个工程,只创建一个SessionFactory。
- session-factory是标签。
hibernate.cfg.xml配置如下:
<?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="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:localhost:3306/hibernatebella?useUnicode=true&characterEncoding=UTF-8</property>
<!-- C3P0 -->
<property name="hibernate.c3p0.acquire_increment">10</property>
<property name="hibernate.c3p0.i">10000</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_statements">10</property>
<!-- 数据库方言 -->
<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"></property>
</session-factory>
</hibernate-configuration>
3、创建实体类
在java文件中创建package,命名为com.bella.entity。
在里面创建三个class,Customer.class、Orders.class和People.class
package com.bella.entity;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.Set;
//@Getter
//@Setter
@Data
public class Customer {
private Integer id;
private String name;
private Set<Orders> orders;// 把多个orders注入customer中
}
package com.bella.entity;
import lombok.Data;
//@Getter
//@Setter
@Data
public class Orders {
private Integer id;
private String name;
// 一个订单对应一个用户
private Customer customer;
}
package com.bella.entity;
import lombok.Data;
//@Getter
//@Setter
@Data
public class People {
private Integer id;
private String name;
private double money;
}
4、创建实体关系映射文件
在实体类中创建Customer.hbm.xml、Orders.hbm.xml和People.hbm.xml
头部依然可以复制:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
配置 hibernate-mapping
以People.hbm.xml为例:
<?xml version="1.0"?>
<!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.bella.entity.People" table="customer">
<!-- 配置主键,name是实体类中的属性,type是类型-->
<id name="id" type="java.lang.Integer">
<!-- 配置字段column,name是表中的字段-->
<column name="id"></column>
<!-- 配置主键自增的方式,identity代表自增 -->
<generator class="identity"></generator>
</id>
<!-- 配置除主键外的属性的其他信息 -->
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<property name="money" type="java.lang.Double">
<column name="money"></column>
</property>
</class>
</hibernate-mapping>
5、实体关系映射文件注册到Hibernate的配置文件中
在核心配置文件hibernate.cfg.xml中,添加实体关系映射文件。
<!-- 注册实体关系映射文件-->
<mapping resource="com/bella/entity/People.hbm.xml"></mapping>
6、使用hibernate API 完成数据操作
报错1:Exception in thread "main" java.lang.NullPointerException
空指针异常--未解决
7、pom.xml中需要配置resource
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
二、hibernate 级联操作
1、一对多关系介绍
如客户和订单:每个客户可以购买多个产品,生成多个订单。但是一个订单只能对应一个客户。
这种关系在数据库中如何体现?
一的一方是主表,多的一方是从表,通过主外键关系来维护。
面向对象中是这样体现的:
2、多对多关系介绍
如大学生选课:一门课程被多个学生选择,一个学生可以选多个课程。
数据库中是通过两个一对多关系来维护。学生和课程都是主表,额外增加一张中间表。主表和中间表是一对多关系。
面向对象中是这样体现的:
Java 和数据库对于这两种关系的体现完全是两种不同的⽅式,Hibernate 框架的作⽤就是将这两种⽅式
进⾏转换和映射。
3、Hibernate 实现⼀对多
Customer.hbm.xml:
<?xml version="1.0"?>
<!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.bella.entity.Customer" table="customer">
<!-- 配置主键,name是实体类中的属性,type是类型-->
<id name="id" type="java.lang.Integer">
<!-- 配置字段column,name是表中的字段-->
<column name="id"></column>
<!-- 配置主键自增的方式,identity代表自增 -->
<generator class="identity"></generator>
</id>
<!-- 配置其他信息 -->
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<!-- 一对多关系:
set 标签来配置实体类中的集合属性 orsers
name 实体类属性名
table 表名
key 外键
one-to-many 与集合泛型的实体类对应-->
<set name="orders" table="oders">
<!-- key 是外键-->
<key column="cid"></key>
<!-- 一对多关系:类型是Orders。创建oders对象,把它塞到set集合中 -->
<one-to-many class="com.bella.entity.Orders"></one-to-many>
</set>
</class>
</hibernate-mapping>
Orders.hbm.xml:
<?xml version="1.0"?>
<!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.bella.entity.Orders" table="orders">
<!-- 配置主键,name是实体类中的属性,type是类型-->
<id name="id" type="java.lang.Integer">
<!-- 配置字段column,name是表中的字段-->
<column name="id"></column>
<!-- 配置主键自增的方式,identity代表自增 -->
<generator class="identity"></generator>
</id>
<!-- 配置其他信息 -->
<property name="name" type="java.lang.String">
<column name="name"></column>
</property>
<!--多对一 :
many-to-one 配置实体类对应的对象属性
name 属性名
class 属性对应的类
column 外键-->
<many-to-one name="customer" class="com.bella.entity.Customer" column="cid"></many-to-one>
</class>
</hibernate-mapping>
还需要在 Hibernate 配置⽂件中进⾏注册。
<!-- 注册实体关系映射文件-->
<mapping resource="com/bella/entity/People.hbm.xml"></mapping>
<mapping resource="com/bella/entity/Customer.hbm.xml"></mapping>
<mapping resource="com/bella/entity/Orders.hbm.xml"></mapping>
⼀对多-Hibernate API 调用:见test2
多对多-Hibernate API 调用:(见test3及相关实体映射关系文件 )
建立Account和Course模型:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.southwind.entity.Account" table="t_account">
<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="account_course">
<key column="aid"></key>
<many-to-many class="com.southwind.entity.Course" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>
上面代码注意:table如写course,它没有外键,所以应该写中间表,key标签下的外键为acount的外键 aid
many-to-many里的外键为course的外键 cid。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.southwind.entity.Course" table="t_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="accounts" table="account_course">
<key column="cid"></key>
<many-to-many class="com.southwind.entity.Account" column="aid"></many-to-many>
</set>
</class>
</hibernate-mapping>
再注册 到Hibernate 配置⽂件中
<mapping resource="com/southwind/entity/Account.hbm.xml"></mapping>
<mapping resource="com/southwind/entity/Course.hbm.xml"></mapping>
API 调用:
package com.southwind.test;
import com.southwind.entity.Account;
import com.southwind.entity.Course;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
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("hibernate.xml");
//获取 SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获取 Session
Session session = sessionFactory.openSession();
Course course = new Course();
course.setName("Java");
Account account = new Account();
account.setName("张三");
Set<Course> courses = new HashSet<>();
courses.add(course);
account.setCourses(courses);
session.save(course);
session.save(account);
session.beginTransaction().commit();
session.close();
}
}
代码见:
bilibili-hibernate学习网址:https://www.bilibili.com/video/BV1v54y1S7Pi?from=search&seid=423326271782832029