Hibernate作为一个优秀的持久化层框架,充分体现了ORM的设计理念,提供了高效的对象到关系型数据库的持久化服务。下面将介绍如何搭建Hibernate的开发环境。
1、下载相关jar包
1.1 下载Hibernate
从Hibernate的官方网站获取所需的jar包,官方网址为http://www.hibernate.org,在该网站可以免费获取Hibernate的帮助文档和jar包。
(1)Hibernate的官方网站。
(2)选择稳定的Hibernate版本。
(3)点击下载。
1.2 下载JDBC数据库驱动
本示例以MySQL数据库为例。
(1)进入下载MySQL数据库驱动的地址:https://dev.mysql.com/downloads/connector/j/
选择:Platform Independent
TAR包是Linux操作系统下的,ZIP包是Windows操作系统下的,这里我们选择ZIP包。
2、搭建Hibernate开发环境
首先创建一个Java项目,并添加上述下载的jar包文件。
(1)解压下载后的Hibernate文件,将目录:hibernate-release-5.4.4.Final\lib\required 下的所有jar包文件添加到项目中。
(2)解压下载后的JDBC数据库驱动文件,将mysql-connector-java-8.0.17.jar文件添加到项目中。
2.1 Hibernate配置文件
Hibernate通过读取默认的XML配置文件 hibernate.cfg.xml 加载数据库的配置信息,该配置文件默认放于项目的根目录下(src目录下)。
【示例】连接应用的MySQL数据库,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.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- 数据库连接的URL -->
<property name="connection.url">jdbc:mysql://localhost:3306/db_admin?useSSL=false&serverTimezone=GMT%2b8</property>
<!-- 数据库连接用户名 -->
<property name="connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="connection.password">123456</property>
<!-- Hibernate方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 打印SQL语句 -->
<property name="show_sql">true</property>
<!-- 映射文件 -->
<mapping resource="com/pjb/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.2 编写Hibernate初始化类
Session对象是Hibernate中数据库持久化操作的核心,它将负责Hibernate所有的持久化操作,通过它开发人员可以实现数据库基本的增、删、改、查的操作。而Session对象又是通过SessionFactory对象获取的,那么SessionFactory对象又是如何创建的呢?可以通过Configuration对象创建SessionFactory,关键代码如下:
Configuration cfg = new Configuration().configure(); // 加载Hibernate配置文件
factory = cfg.buildSessionFactory(); // 实例化SessionFactory
【示例】创建HibernateUtil类,用于实例化对Hibernate的初始化。
package com.pjb.hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate公共类
* @author pan_junbiao
**/
public class HibernateUtil {
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();//ThreadLocal对象
private static SessionFactory sessionFactory = null;//SessionFactory对象
//静态块
static {
try {
// 加载Hibernate配置文件
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.err.println("创建会话工厂失败");
e.printStackTrace();
}
}
/**
* 获取Session
* @return Session
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession(): null;
threadLocal.set(session);
}
return session;
}
/**
* 重建会话工厂
*/
public static void rebuildSessionFactory() {
try {
// 加载Hibernate配置文件
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.err.println("创建会话工厂失败");
e.printStackTrace();
}
}
/**
* 获取SessionFactory对象
* @return SessionFactory对象
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* 关闭Session
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();//关闭Session
}
}
}
2.3 编写持久化类
在Hibernate中持久化类是Hibernate操作的对象,也就是通过对象-关系映射(ORM)后数据库表所映射的实体类,用来描述数据库表的结构信息。在持久化类中的属性应该与数据库表中的字段相匹配。
【示例】创建名称为User的JavaBean。
package com.pjb.entity;
/**
* 用户信息实体类
* @author pan_junbiao
**/
public class User
{
private int id; //用户编号
private String name; //用户姓名
private String blog; //博客地址
private int age; //年龄
private String remark; //备注
//默认的构造方法
public User() {
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getBlog()
{
return blog;
}
public void setBlog(String blog)
{
this.blog = blog;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
}
2.4 创建Hibernate映射
Hibernate的核心就是对象关系映射,对象和关系型数据库之间的映射通常是用XML文档来实现的。这个映射文档被设计成易读的,并且可以手工修改。映射文件的命名规则为*.hbm.xml,以User的持久化类的映射文件为例,代码如下:对User对象进行配置。
【示例】创建文件名为User.hbm.xml的配置文件,对User对象进行配置。
<?xml version="1.0" encoding="UTF-8"?>
<!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.pjb.entity.User" table="tb_user">
<!-- 用户编号id值 -->
<id name="id" column="id" type="int">
<!-- 持久化类的唯一性标识 -->
<generator class="native"/>
</id>
<!-- 用户姓名 -->
<property name="name" type="string" not-null="true" length="20">
<column name="name"/>
</property>
<!-- 博客地址 -->
<property name="blog" type="string" not-null="true" length="20">
<column name="blog"/>
</property>
<!-- 年龄 -->
<property name="age" type="int">
<column name="age"/>
</property>
<!-- 备注 -->
<property name="remark" type="string" length="50">
<column name="remark"/>
</property>
</class>
</hibernate-mapping>
3、运行测试
【示例】使用Hibernate框架获取用户信息。
(1)在MySQL数据库中创建tb_user用户信息表,并添加一条用户数据。
-- 判断数据表是否存在,存在则删除
DROP TABLE IF EXISTS tb_user;
-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
name VARCHAR(20) NOT NULL COMMENT '用户姓名',
blog VARCHAR(50) NOT NULL COMMENT '博客地址',
age INT COMMENT '年龄',
remark VARCHAR(50) COMMENT '备注'
) COMMENT = '用户信息表';
-- 添加数据
INSERT INTO tb_user(NAME,blog,age,remark)
VALUES('pan_junbiao的博客','https://blog.csdn.net/pan_junbiao',32,'您好,欢迎访问 pan_junbiao的博客!')
(2)创建GetUser类,使用Hibernate获取用户信息。
package com.pjb.main;
import org.hibernate.Session;
import com.pjb.hibernate.HibernateUtil;
import com.pjb.entity.User;
/**
* 获取用户信息
* @author pan_junbiao
**/
public class GetUser
{
public static void main(String[] args)
{
Session session = null; //声明Session对象
try {
//Hibernate的持久化操作
session = HibernateUtil.getSession();//获取Session
User user = (User) session.get(User.class, 1); //装载对象
System.out.println("用户编号:"+user.getId());
System.out.println("用户姓名:"+user.getName());
System.out.println("博客地址:"+user.getBlog());
System.out.println("年龄:"+user.getAge());
System.out.println("备注:"+user.getRemark());
} catch (Exception e) {
System.out.println("对象装载失败");
e.printStackTrace();
} finally{
HibernateUtil.closeSession();//关闭Session
}
}
}
执行结果: