在网上看了一下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&characterEncoding=utf8&useSSL=false&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&characterEncoding=utf8&useSSL=false&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变量进行相关的数据库操作。