前面已经介绍了Hibernate的一点知识,现在我们来一步一步开发Hibernate程序来学习。在这里我使用IDEA作为开发工具,Gradle作为项目构建工具。当然在实际中不一定必须使用这两个工具,我们可以选择自己习惯使用的工具。只要正确的添加了Hibernate相关类以及数据库驱动,我们就能正确的运行Hibernate程序了。
新建项目
使用IDEA新建一个Gradle项目,新建之后,在build.gradle
文件中添加如下内容:
group 'yitian.learning'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'war'
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'
apply plugin: 'eclipse'
apply plugin: 'idea'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'
compile 'org.hibernate: hibernate - core: 5.2.5.Final'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
在Gradle解决项目依赖之后,我们就可以开始搭建Hibernate开发环境了。
SessionFactory
SessionFactory是Hibernate最重要的一个类,也是我们配置和使用Hibernate的第一步。它类似于我们学习JDBC时候的数据库连接,SessionFactory会为我们管理做好所有事情。一般情况下一个项目只需要一个SessionFactory就可以了。我们需要做的,就是编写它的配置文件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.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/htest</property>
<property name="connection.username">root</property>
<property name="connection.password">1234678</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
</session-factory>
</hibernate-configuration>
以上就是Hibernate的配置文件,有JDBC开发经验的同学应该很熟悉前面几项内容吧。重点是后面这几项。
- dialect 代表的是Hibernate使用的方言。Hibernate设计时候考虑到了多种数据库,所以这里需要指定我们使用的数据库。在这里我是用的就是MySQL数据库。
- show_sql 代表的是在Hibernate会在运行的时候同时将所执行的SQL语句输出到控制台上,方便我们开发调试。
- hbm2ddl.auto 代表的是数据库的生成策略。在这里使用create代表每次运行程序都重新创建数据库。这也是我们开发时常用的选项。
配置文件写好之后,我们就可以开始创建SessionFactory了。随着Hibernate的更新,SessionFactory的创建方式也发生了变化。以前我看视频教程的时候,我照着老师的创建方式创建SessionFactory的时候,Hibernate提示我老师讲的那种方式已经过时了。不过现在我直接看的Hibernate官方文档,所以下面这个方式应该是比较新的。
代码语言:javascript复制package yitian.data;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure()
.build();
try {
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
} catch (Exception e) {
StandardServiceRegistryBuilder.destroy(registry);
throw new RuntimeException(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
这就是我的SessionFactory创建类,为了省事我直接写为了静态类,实际情况中一般使用Spring来管理Hibernate SessionFactory的生命周期。重点是静态初始化块中的代码,这就是Hibernate的初始化方式。StandardServiceRegistryBuilder
类会搜索我们刚才写的hibernate.cfg.xml
配置文件,所以为了保证正确的初始化SessionFactory,一般情况下需要将hibernate.cfg.xml
放在CLASSPATH下。由于我用的是Gradle,所以配置文件要放在resources
文件夹下。如果是普通的Java Web项目,就放在webapps/WEB-INF
下。一开始我直接从Hibernate官方教程抄的代码,结果它直接在catch中吃掉了异常,导致我一天没搞明白错误在哪里。因此在这里我加上了抛出语句。
接下来测试一下SessionFactory是否配置成功。我在这里将单元测试写在src/test/java
文件夹中,以便让Gradle自动运行这些测试。
package yitian.data;
import org.hibernate.SessionFactory;
import org.junit.*;
public class HibernateTest {
private static SessionFactory factory;
@BeforeClass
public static void init() {
factory = HibernateUtil.getSessionFactory();
}
@Test
public void testHibernate() {
Assert.assertNotNull(factory);
}
@AfterClass
public static void clean() {
factory.close();
}
}
这个单元测试很简单,就是看一下SessionFactory是否为空。使用Gradle的话运行一下gradle test
命令即可。如果没有使用Gradle的话也可以使用Eclipse或者IDEA提供的单元测试工具来测试。测试完成之后,我们就可以开始以后的Hibernate学习了。
单元测试结果和目前的项目结构如下: