《后端》bilibili-Hibernate精讲教程,通俗易懂-2021年1月11日

一、如何使用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&amp;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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值