[Hiberate][IDEA] 使用IDEA+Maven搭建Hiberate项目

743 阅读5分钟

在网上看了一下Hiberate教程,感觉写的都有点乱,或者就是缺少了一些内容,比如配置文件的讲解,Bean类的多种创建方式等,因此自己也写一篇Hiberate的教程。


可以参考目录来预览项目搭建的流程。

使用IDEA创建Maven项目

参考:使用IDEA创建Maven项目和Maven使用入门(配图详解)

添加pom依赖

<!--引入hibernate包-->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.3.2.Final</version>
</dependency>
 <!--引入mysql包-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.15</version>
</dependency>

添加配置文件

配置文件的添加可以使用IDEA实现,但我觉得过于复杂。我采用的是手动的方式,手动的方式我反而觉得比较方便。

首先,为项目创建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">admin</property>

    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

    <!--将其中的db_name替换成你需要连接的数据库名-->
    <property name="connection.url">jdbc:mysql://localhost:3306/db_name?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</property>

    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>

    <!--在这里,一般update用的比较多。update的含义为,若数据表不存在,则自动创建数据表。其他可选的值可自行百度。-->
    <property name="hbm2ddl.auto">update</property>

    <!--class的值为Bean类,Bean类的添加在后文中介绍,请继续看下去。-->
    <mapping class="com.mooctest.database.Test1"/>
    <mapping class="com.mooctest.database.Test2"/>
  </session-factory>
</hibernate-configuration>

添加Bean类

添加Bean类有两种方式:

第一种是手动添加,这种方式适合于数据库还未建立时,在代码中写好Bean类,Hiberate会根据Bean类自动创建数据表;

第二种方法是根据数据表自动生成Bean类,这种方法可以借助IDEA自动生成Bean类,适合于数据表已存在的情况。

手动添加Bean类

新建java类,并添加如下内容:

import javax.persistence.*;

@Entity
@Table(name = "test")
public class Test {
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY)
    int id;

    @Basic
    String name;
}

代码中省略了部分代码,例如toString方法、构造方法、hashCode方法,请读者自行补充。从Hiberate的角度,以上代码已足够。

以上代码映射到了名为test的数据表,该表中有两个字段(id和name),其中id为主键,且是自增的,name为String类型(在数据库中为varchar类型)。

需要注意的是,@GeneratedValue( strategy = GenerationType.IDENTITY)

strategy的值有四个选项:

  • TABLE:使用一个特定的数据库表格来保存主键。
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  • IDENTITY:主键由数据库自动生成(主要是自动增长型)
  • AUTO:主键由程序控制。

前两种用的不多,主要说一下后两个。

IDENTITY的含义就是自增,一般适用于主键。

AUTO的含义是由程序控制,程序会根据该字段在数据表中的情况来决定,例如,该字段在数据库中被设置成了自增,那么当程序往数据库中写数据时,就会将该变量以自增的形式写进数据库中。

添加完Bean类后,需要手动修改hibernate.cfg.xml文件,添加代码<mapping class="com.mooctest.database.Test"/>

使用IDEA自动生成Bean类

该方法不是很推荐,因为在自动生成时,会修改hibernate.cfg.xml文件,主要就是会删除connection.username和connection.password,并重置connection.url。

重置connection.url的坏处是,之前的一些配置就不见了。之前的配置是这样的:<property name="connection.url">jdbc:mysql://localhost:3306/db_name?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</property>

问号后面是一系列配置,根据我的经验,最好这样写。其中有一些是设置字符编码的,不这样设置有时会导致存入数据库的中文乱码。有一些是设置时区的,不这样设置有时可能导致连不上数据库,关于这一点可以看一下这篇博客:使用IDEA连接数据库时报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually

不过比较奇怪的地方是,自动删除connection.username和connection.password后,在本地运行Hiberate,依旧可以连接上数据库,我不清楚这是什么原因,不过connection.username和connection.password最好还是配置好比较好。

说的有点多了,接下来进入正题。

首先,第一步,使用IDEA连接数据库。

可以参考这篇博客:IntelliJ IDEA配置连接MySQL数据库

若连接时提示以下错误:

Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

可以参考这篇博客:使用IDEA连接数据库时报错

连接数据库成功后,点击左下角的Persistence按钮,之后,右击第一行的项目名。

添加数据库操作类

新建java类,添加如下代码:

package com.mooctest.database;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class DBTool {
    private static SessionFactory sessionFactory;
    public static Session session;
    private static Transaction transaction;

    public static void init(){
        //创建会话工厂
        sessionFactory = new Configuration().configure().buildSessionFactory();
        // 开启会话
        session =sessionFactory.openSession();
        //开启事物
        transaction = session.beginTransaction();
    }

    public static void destory(){
        //关闭事物
        transaction.commit();
        //关闭对话
        session.close();
        // 关闭会话工厂
        sessionFactory.close();
    }

    public static void main( String[] args ) {
        DBTool.init();
        DBTool.session.save(new Test("test"));
        DBTool.destory();
    }
}

之后,便可使用DBTool类的session变量进行相关的数据库操作。

Reference