【Java中级】6.0 SSH之Hibernate框架(二)——使用Hibernate完成CRM客户管理(下)...

1.0 导入Junit的jar包

在项目的实际开发中,我们需要在完成每层的功能代码实现之后去对该功能的代码进行测试,这是因为如果在所有的代码都写完之后在测试的话,会造成调试困难,代码修改起来也很繁琐,这样开发效率会大大降低,不利于项目的开发。这时候需要用到Junit包。导入Junit如下所示:


16102290-aaf10270338a42bd.png
image.png

16102290-24964a2dcaf4d158.png
image.png

16102290-6b5c3abb2ce526cd.png
image.png

16102290-95b2d272730b1fc1.png
image.png

16102290-973d29c87bca78b5.png
image.png
2.0 编写测试代码

代码如下:

package com.edp.learn;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;

/**
 * Hibernate入门案例
 * 
 * @author EdPeng
 * @version 创建时间 2020年1月15日上午9:37:42 
 * 类说明
 */

public class HibernateDemo1 {
    @Test
    // 保存客户的案例
    public void demo1() {
        // 4.3版本以下的方法
//      //1.加载hibernate的核心配置文件
//      Configuration  configuration = new Configuration().configure();
//      //这样才知道连接的是哪个数据库,采用的是何种方言
//      
//      //2.创建一个SessionFactory对象,类似于JDBC中连接池
//      SessionFactory sessionFactory=configuration.buildSessionFactory();
//      //3.通过SessionFactory,获取Session对象。类似于JDBC中的Collection
//      //相当于Hibernate已经和MySQL数据库建立起连接了
//      Session session = sessionFactory.openSession();
//      //4.手动开启事务:在hibernate5以后,不用手动开启事务,但这是为了去兼容hibernate3
//      Transaction transaction = session.beginTransaction();
//      //5.编写代码
//      Customer customer=new Customer();
//      customer.setCust_name("张三");
//      session.save(customer);
//      //6.事务提交
//      transaction.commit();
//      //等同于session.getTransaction().commit();
//      //7.资源释放
//      session.close();
//      Hibernate5.3时的方法
        //1.加载hibernate的核心配置文件
        //这样才知道连接的是哪个数据库,采用的是何种方言
        //2.创建一个SessionFactory对象,类似于JDBC中连接池
        StandardServiceRegistry  sr = new StandardServiceRegistryBuilder().configure().build(); 
        //3.通过SessionFactory,获取Session对象。类似于JDBC中的Collection
        //相当于Hibernate已经和MySQL数据库建立起连接了
        SessionFactory sf = new MetadataSources(sr).buildMetadata().buildSessionFactory();       
        
        Session session = sf.openSession();
        //4.手动开启事务:在hibernate5以后,不用手动开启事务,但这是为了去兼容hibernate3
        Transaction ts = session.beginTransaction();
        //5.编写代码
        Customer customer = new Customer();
        customer.setCust_name("张三");
        session.save(customer);
        //6.事务提交
        ts.commit();
//      等同于session.getTransaction().commit();
        //7.资源释放
        session.close();

    }
}

在4.3以下版本中,需要用到Configuration 类,5.3版本也用到,但是作为内嵌使用,没有分开表示出来。其底层代码如下:


16102290-91634a16c33551f1.png
image.png

16102290-80a08f28ae1d43ec.png
image.png

16102290-b7d05288d455ce20.png
image.png

当前我用的hibernate版本为5.3.15,连接方式与众不同。
值得注意的是hibernate.cfg.xml文件也需要做相对的修改,以用于匹配hibernate5.3.15和MySQL8.0.xx版本(我的为8.0.18):

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> -->
        <!-- MySQL8.0以后,用的连接驱动改变了,driver必须加上.cj -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        
        <!--MySQL8.0以后, url为jdbc:mysql://localhost:3306/test后面加?useSSL=false&serverTimezone=UTC -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_learn?useSSL=false&amp;serverTimezone=UTC</property>
        <!-- &符号在Hibernate不可用,需写成&amp;使用MySQL8Dialect -->
        <!-- jdbc:mysql://localhost:3306/hibernate_learn连接本地库可以省略,所以这里用/// -->
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">bywwcnll</property>

        <!-- 配置hibernate的方言 告诉hibernate要识别MySQL的“方言”(这样,hibernate就能帮开发者生成MySQL识别的SQL语句) -->
        <!-- name="hibernate.dialect":表示Hibernate的方言就是MySQL -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <!--<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> -->
        <!--<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> -->
        
        <!-- 可选配置 -->
        <!-- 打印SQL语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化SQL,使SQL语句在打印的时候更加漂亮 -->
        <property name="hibernate.format_sql">true</property>
        
        
        <!-- 告诉核心配置文件,我要加载哪个映射 -->
        <mapping resource="com/edp/learn/Customer.hbm.xml" />
    </session-factory>
</hibernate-configuration>

运行结果如下:


16102290-88906a3b415a9d97.png
image.png

可见,如果你的hibernate核心配置文件名不为hibernate.cfg.xml,则需要如下编写代码:

        StandardServiceRegistry  sr = new StandardServiceRegistryBuilder()
                                  .configure("路径/自命名称.hbm.xml").build(); 

查看数据库:


16102290-4d67e31acf7d0136.png
image.png

成功运行hibernate。

3.0 hibernate常见的配置

3.1 XML提示的配置
当我们的电脑处于联网状态时,如下图所示:


16102290-e1c4d05af637f121.png
image.png

eclipse会自动连接绿色标记的网址,从网络上得到提示,提供开发人员此类XML文件的代码提示,但当不处于联网状态时,则没有任何提示,这时候需要我们自行配置。
首先我们需要在hibernate解压后的文件夹中找到两个文件:


16102290-7027dcb33d851401.png
image.png

提取出来,或者记住路径。然后打开Peferences:
16102290-477865ce97b8a727.png
image.png

搜索“xml ca”即可找到我们要找的“xml Catalog”,然后如下图指示
16102290-b4dd5f9a6f43387b.png
image.png

16102290-6b390738234b6668.png
image.png

1是文档路径,2选Uri,3是复制如下内容得到的:


16102290-3c371ec651847b12.png
image.png

文档选择相应的文档:
16102290-49f09ca73b1f183f.png
image.png

最后点击OK,再点击Apply and Close。
16102290-619dd3901044eaf1.png
image.png

凡是XML文件需要代码提示的都是如此配置。不仅仅限制于hibernate。
4.0 Hibernate映射的配置

首先我们先参考已经写过的配置:

<?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>
    <!-- hibernate-mapping是根标签 -->
    <!-- 建立类与表的映射 -->
    <class name="com.edp.learn.Customer" table="cst_customer">
        <!-- name:哪个类,全路径,table:哪个表 -->

        <!-- Id:建立类中的属性与表中的主键对应 -->
        <id name="cust_id" column="cust_id">
            <!-- name:在类中的名字 column:表中的字段;此处为一样的名称 -->
            <generator class="native" />
            <!-- 组件都有一种生成策略,此处使用一种本地策略。 -->
        </id>
        <!-- 建立类中的普通属性和表的字段的对应 -->
        <!-- 除了主键以外的属性,都用property -->
        <property name="cust_name" column="cust_name" />
        <!-- 客户的名称 -->
        <property name="cust_source" column="cust_source" />
        <!-- 客户的来源 -->
        <property name="cust_industry" column="cust_industry" />
        <!-- 客户所属行业 -->
        <property name="cust_level" column="cust_level" />
        <!-- 客户的级别 -->
        <property name="cust_phone" column="cust_phone" />
        <!-- 客户的固定电话 -->
        <property name="cust_mobile" column="cust_mobile" />
        <!-- 客户的移动电话 -->
    </class>

</hibernate-mapping>
4.1 class标签的配置

标签作用

建立类与表的映射关系

常用属性

name:类的全路径
table:表名(类名和表名一致,table可以省略。)
catalog: 数据库名,可以不用写。

在本例中,如果使用catalog属性,代码示范如下:

<class name="com.edp.learn.Customer" table="cst_customer" catalog="hibernate_learn">

再如上的代码中,在 class标签中,nametable不一致, table标签必须声明,不然Hibernate会自动创建一个名为Customer的数据库。

4.2 id标签的配置

标签作用

用来建立类中的属性与表中的主键的对应关系。

常用属性名称属性说明
name类中的属性名
column表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略。)
length长度
type数据类型

主键中没有not-null属性,因为主键一定是非空的。

length: hibernate可以根据你的映射自动建表,只要运行自己的程序就可以帮你把表建立起来,在没有给定长度的情况下,会使用默认长度255。
自动创建表的配置代码如下:

        <!-- 可选配置 -->
        <!-- 打印SQL语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化SQL,使SQL语句在打印的时候更加漂亮 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 自动创建表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 告诉核心配置文件,我要加载哪个映射 -->
        <mapping resource="com/edp/learn/Customer.hbm.xml" />
4.3 property标签的配置

标签作用

标签用来建立类中的普通属性与表的字段的对应关系。

常用属性名称属性说明
name类中的属性名
column表中的字段名
length长度
type类型
not-null是否非空,设置非空
unique是否唯一,设置唯一

其中, type有三种写法。

  1. Java写法
<property name="cust_name" column="cust_name" length="32"
            type="java.lang.String" />
  1. Hibernate写法
        <property name="cust_source" column="cust_source" length="32"
            type="string" />
  1. MySQL数据库写法
<property name="cust_industry" length="32">
            <column name="cust_industry" sql-type="varchar"></column>
        </property>

但是,type我们一般不用去写,Hibernate会帮我们自动转换。
not-null标签,如下写法表示不能为空,unique标签表示不唯一:

        <property name="cust_name" column="cust_name" length="32" not-null="true" unique="false" />

property标签部分,完整代码如下:

<!-- 建立类中的普通属性和表的字段的对应 -->
        <!-- 除了主键以外的属性,都用property -->
        <property name="cust_name" column="cust_name" length="32" not-null="true" unique="false" />
        <!-- 客户的名称 -->
        <property name="cust_source" column="cust_source" length="32"
            type="string" />
        <!-- 客户的来源 -->
        <property name="cust_industry" length="32">
            <column name="cust_industry" sql-type="varchar"></column>
        </property>
        <!-- 客户所属行业 -->
        <property name="cust_level" column="cust_level" />
        <!-- 客户的级别 -->
        <property name="cust_phone" column="cust_phone" />
        <!-- 客户的固定电话 -->
        <property name="cust_mobile" column="cust_mobile" />
        <!-- 客户的移动电话 -->

property标签和id标签中,namecolumn一致, column标签可以不用声明。

5.0 Hibernate核心的配置
5.1 必须的配置
  1. 连接数据库的基本的参数

驱动类
url路径
用户名
密码

  1. 方言
5.2 可选的配置

显示SQL
格式化SQL
自动建表

none 不使用Hibernate的自动建表
create 如果数据库中已经有表,删除原有的表,重新创建新的表。如果没有表,新建表。(主要是做测试时使用)
create-drop 如果数据库已经有表,删除原有表,执行操作,删除这个表.如果没有表,新建一个,使用完删除该表。(主要是做测试时使用)
update 使用原来的表,如果没有,创建新的表。(可以更新表结构)
validate 如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构是否一致)

在开发中,我们一般用updatevalidate属性。
测试create-drop 属性,想看到效果,需要在代码中把工厂给关了:

        //7.资源释放
        session.close();
        sessionFactory.close();

sessionFactory.close();语句执行时,就会删除之前新建的表。
示范代码如下:

        <!-- 打印SQL语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化SQL,使SQL语句在打印的时候更加漂亮 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 自动创建表-->
        <property name="hibernate.hbm2ddl.auto">update</property>
5.3 映射文件的引入

引入映射文件的位置,示范代码如下:

<!-- 告诉核心配置文件,我要加载哪个映射 -->
        <mapping resource="com/edp/learn/Customer.hbm.xml" />
6.0 Hibernate的核心配置方式
6.1 属性文件的方式

属性文件的名字一般为:Hibernate.properties
属性文件的写法和XML文件基本一致,具体参考上一篇我的文章中的最后附文Hibernate.properties中具体内容,示范代码如下:

        hibernate.connection.driver_class=com.mysql.cj.jdbc.Driver
        …
        hibernate.show_sql=true

但是,属性文件的方式不能引入映射文件(需要手动编写代码加载映射文件)。

6.2 XML文件的方式(一般情况用这种)

XML文件的名字一般为:hibernate.cfg.xml

END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值