Hibernate快速入门、快速使用(Hibernate级联操作)

3 篇文章 0 订阅
2 篇文章 1 订阅

目录

一、Hibernate简介 

二、如何使用 

三、具体操作

1、创建maven工程

2、添加 hibernate.cfg.xml 文件

3、创建实体类

4、创建实体关系映射文件 

5、将实体类关系映射文件注册到 Hibernate.cfg.xml 配置文件中

6、使用 Hibernate API 完成数据操作

7、pom.xml 文件中需要配置 resource

8、查看执行结果

四、Hibernate 级联操作

1、一对多关系

2、多对多关系

3、Hibernate 实现一对多

3.1、编写 Customer.hbm.xml 关系映射文件

3.2、编写 Orders.hbm.xml 关系映射文件

3.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中

3.4、编写测试类调用 Hibernate API 保存数据

3.5、查看执行结果

4、Hibernate 实现多对多 

4.1、编写 Student.hbm.xml 关系映射文件

4.2、编写 Course.hbm.xml 关系映射文件 

4.3、将实体类关系映射文件注册到 hibernate.cfg.xml 配置文件中

4.4、编写测试类调用 Hibernate API 保存数据

4.5、查看执行结果


一、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&amp;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快速入门 篇就结束了...

感谢大家的阅读!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值