前言
Hibernate 是一個(gè)優(yōu)秀的持久層的框架,當(dāng)然,雖然現(xiàn)在說(shuō)用得比較多的是 MyBaits,但是我工作中也不得不接觸 Hibernate,特別是一些老項(xiàng)目需要你維護(hù)的時(shí)候。所以,在此寫下這篇文章,方便自己回顧,也方便新手入門體驗(yàn) Hibernate。
注:使用的版本是 Hibernate 5.x 的
什么是 ORM?
ORM(Object Relational Mapping,對(duì)象關(guān)系映射)可以說(shuō)是一種理論,或者說(shuō)是一種設(shè)計(jì)思想,主要是讓「關(guān)系型數(shù)據(jù)庫(kù)」和「面向?qū)ο缶幊陶Z(yǔ)言」之間建立映射關(guān)系。目的是將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為對(duì)象,以便開(kāi)發(fā)人員更方便地進(jìn)行數(shù)據(jù)庫(kù)操作。
那為什么會(huì)出現(xiàn) ORM 呢?
在我們學(xué)習(xí) JDBC 的時(shí)候,我們需要編寫大量的 SQL 語(yǔ)句來(lái)執(zhí)行數(shù)據(jù)庫(kù)的 CRUD 操作,而且還需要手動(dòng)將查詢結(jié)果轉(zhuǎn)換為對(duì)象。這樣的操作是比較繁瑣的,還容易出錯(cuò),而且對(duì)于大型項(xiàng)目來(lái)說(shuō),數(shù)據(jù)庫(kù)操作的代碼量通常很大,維護(hù)起來(lái)也是非常困難的。所以,ORM 出現(xiàn)了,幫助我們簡(jiǎn)化數(shù)據(jù)庫(kù)操作,提高開(kāi)發(fā)效率。
市面上有很多不同的 ORM 框架可供選擇,在 Java 后端開(kāi)發(fā)的學(xué)習(xí)路線上,我們需要知道的就有 Hibernate 和 MyBatis。
簡(jiǎn)單來(lái)說(shuō),ORM 就是將數(shù)據(jù)庫(kù)操作封裝成對(duì)象操作,通過(guò)對(duì)象的方式來(lái)進(jìn)行數(shù)據(jù)庫(kù)的增刪改查。
理解 JPA 和 ORM 的關(guān)系
JPA(Java Persistence API)是 Java EE(現(xiàn)在稱為 Jakarta EE)規(guī)范中定義的一套 API,用于實(shí)現(xiàn)對(duì)象和關(guān)系數(shù)據(jù)庫(kù)之間的映射。JPA 提供了一種標(biāo)準(zhǔn)的方式來(lái)進(jìn)行對(duì)象持久化操作。而 ORM 是一個(gè)通用的概念,不局限于特定的編程語(yǔ)言或框架。比如 Python 也有對(duì)應(yīng)的實(shí)現(xiàn) ORM 的框架。
換句話說(shuō),JPA 它定義了一系列的接口和注解,開(kāi)發(fā)者可以使用這些接口和注解來(lái)描述對(duì)象和數(shù)據(jù)庫(kù)表之間的映射關(guān)系,并進(jìn)行數(shù)據(jù)庫(kù)操作。而 ORM 是一個(gè)更廣泛的概念,它可以適用于其他編程語(yǔ)言和框架,并不局限于 Java 和 JPA。
注:JPA 就只定義,沒(méi)有具體實(shí)現(xiàn),就是所謂的規(guī)范、標(biāo)準(zhǔn),我 JPA 規(guī)定了這些 API 能進(jìn)行相關(guān)操作,具體的實(shí)現(xiàn)是交給軟件廠商去實(shí)現(xiàn)的,比如 Hibernate 就是 JPA 標(biāo)準(zhǔn)的一種實(shí)現(xiàn)。
理解 JPA 和 Hibernate 的關(guān)系
Hibernate 是 JPA 的一種具體實(shí)現(xiàn),它使用了 JPA 規(guī)范定義的接口和注解,提供了 ORM 功能。
從時(shí)間線上來(lái)看:JPA(Java Persistence API)是在 Hibernate 之后出現(xiàn)的。
最早由 Gavin King 在2001年創(chuàng)建 Hibernate,目標(biāo)是簡(jiǎn)化開(kāi)發(fā)人員進(jìn)行數(shù)據(jù)庫(kù)的操作,以面向?qū)ο蟮姆绞饺ゲ僮鲾?shù)據(jù)庫(kù)。
JPA 的第一個(gè)版本是在2006年發(fā)布的,其中包含了一系列的接口和注解,用于描述對(duì)象和數(shù)據(jù)庫(kù)表之間的映射關(guān)系,以及進(jìn)行數(shù)據(jù)庫(kù)操作。Hibernate 的創(chuàng)始人 Gavin King 是 JPA 規(guī)范的主要參與者之一。
JPA 規(guī)范的出現(xiàn)是為了標(biāo)準(zhǔn)化 ORM 框架的行為和功能,使開(kāi)發(fā)人員可以在不同的 ORM 實(shí)現(xiàn)之間進(jìn)行切換,而不需要修改大量的代碼。
總結(jié)來(lái)說(shuō),Hibernate 是在 JPA 規(guī)范之前出現(xiàn)的 ORM 框架,而 JPA 是在 Hibernate 的基礎(chǔ)上產(chǎn)生的一套標(biāo)準(zhǔn)化的 ORM API。Hibernate 作為 JPA 的一種實(shí)現(xiàn),為開(kāi)發(fā)人員提供了強(qiáng)大的 ORM 功能,并成為了 JPA 規(guī)范的主要影響者之一。
正題:Hibernate 簡(jiǎn)介
Hibernate 是全自動(dòng)的對(duì)象關(guān)系映射的持久層框架,主要通過(guò)持久化類(.Java,當(dāng)然,也習(xí)慣說(shuō)的實(shí)體類)、映射文件(.hbm.xml)和配置文件(.cfg.xml)來(lái)操作關(guān)系型數(shù)據(jù)庫(kù)。
Hibernate 封裝了數(shù)據(jù)庫(kù)的訪問(wèn)細(xì)節(jié),通過(guò)配置的屬性文件,來(lái)關(guān)聯(lián)上關(guān)系型數(shù)據(jù)庫(kù)和實(shí)體類的。
Hibernate 中有 3 個(gè)我們需要知道的類,分別是配置類(Configuration)、會(huì)話工廠類(SessionFactory)和會(huì)話類(Session),注意,此處的 Session 可不是 HttpSession ?。?/strong>
- 配置類
主要負(fù)責(zé)管理 Hibernate 的配置信息以及 Hibernate 的啟動(dòng),在運(yùn)行的時(shí)候,配置類會(huì)讀取一些底層的基本信息,比如數(shù)據(jù)庫(kù)的 URL、數(shù)據(jù)庫(kù)的用戶名、密碼、驅(qū)動(dòng)類、方言(適配器,Dialect)等信息。
- 會(huì)話工廠類
主要負(fù)責(zé)生成 Session,這個(gè)工廠類會(huì)保存當(dāng)前數(shù)據(jù)庫(kù)中所有的映射關(guān)系。
- 會(huì)話類
持久化操作的核心,通過(guò)它實(shí)現(xiàn) CRUD,它不是線程安全的,需要注意不要多個(gè)線程共享一個(gè) Session 對(duì)象。
理解會(huì)話二字:顧名思義,實(shí)際上就是交流,通信。在網(wǎng)絡(luò)中,一次會(huì)話可以是一次 HTTP 請(qǐng)求到 HTTP 響應(yīng)的過(guò)程,在數(shù)據(jù)庫(kù)操作中,一次會(huì)話,可以是一次新增操作的請(qǐng)求到數(shù)據(jù)庫(kù)中,然后數(shù)據(jù)庫(kù)做出響應(yīng)。
使用 Maven 構(gòu)建 Hibernate 項(xiàng)目
最原始引入 Jar 包的方式來(lái)創(chuàng)建 Hibernate 項(xiàng)目,可以參考這里:
http://m.biancheng.net/hibernate/first-example.html
由于我比較懶,所以使用 Maven 來(lái)構(gòu)建一個(gè)具有 Hibernate 的 Web 項(xiàng)目。
引入依賴項(xiàng)
分別引入 Hibernate、MySQL 數(shù)據(jù)庫(kù)驅(qū)動(dòng)、單元測(cè)試 Junit4(創(chuàng)建 Maven 時(shí)自帶的)。
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.14.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
Hibernate 配置文件
在 resource 目錄下創(chuàng)建一個(gè) 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>
<!-- 配置數(shù)據(jù)源、連接池等相關(guān)信息 -->
<property name="connection.url">jdbc:mysql://localhost:3306/demo_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- Hibernate 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印 SQL 語(yǔ)句-->
<property name="show_sql">true</property>
<!-- 格式化 SQL 語(yǔ)句-->
<property name="format_sql">true</property>
<!-- 映射文件所在位置 -->
<mapping resource="cn/god23bin/demo/domain/mapping/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
以上的配置只是一小部分,還可以配置數(shù)據(jù)庫(kù)連接池、是否自動(dòng)生成數(shù)據(jù)庫(kù)表等等。
持久化類(實(shí)體類)
我們是通過(guò)持久化類來(lái)操作數(shù)據(jù)庫(kù)表的,也就是 ORM 的體現(xiàn),即對(duì)象映射到數(shù)據(jù)庫(kù)表,數(shù)據(jù)庫(kù)表也映射對(duì)象,操作對(duì)象就相當(dāng)于操作數(shù)據(jù)庫(kù)表。所以我們需要編寫持久化類來(lái)描述數(shù)據(jù)庫(kù)表,類中的屬性需要與數(shù)據(jù)庫(kù)表中的字段相匹配。
創(chuàng)建一個(gè) User 類,作為一個(gè) JavaBean(只有 getter 和 setter 方法,沒(méi)有其他業(yè)務(wù)方法的對(duì)象)
package cn.god23bin.demo.domain.entity;
/**
* @author god23bin
*/
public class User {
private Integer id;
private String name;
private String password;
// 省略 getter 和 setter 方法
}
這種類(JavaBean)在日常開(kāi)發(fā)中是無(wú)處不在的,百分之百會(huì)用到,也稱它為 POJO(Plain Old Java Object),我們知道這種概念就行,反正這種類就只有屬性和對(duì)應(yīng)的 getter 和 setter 方法。
需要注意的幾點(diǎn):
- 必須有無(wú)參構(gòu)造方法,便于 Hibernate 通過(guò) Constructor.newInstance() 實(shí)例化持久類。
- 提供一個(gè)標(biāo)識(shí)屬性,一般這個(gè)標(biāo)識(shí)屬性映射的是數(shù)據(jù)庫(kù)表中的主鍵字段,就上面 User 中的 id 屬性。
- 設(shè)計(jì)實(shí)體類,屬性都是聲明為 private 的。
Hibernate 映射
我們單獨(dú)寫了一個(gè)持久化類,目前是還沒(méi)有做映射的,也就是說(shuō)還不能通過(guò)這個(gè)類去操作數(shù)據(jù)庫(kù),那如何去做映射呢?
這就涉及到一個(gè)映射文件了,映射文件是 xml 文件,命名規(guī)則一般是 持久化類名.hbm.xml
,以 User 為例,它的映射文件就是 User.hbm.xml
。
我們可以在項(xiàng)目某個(gè)包下創(chuàng)建映射文件,我選擇在 cn.god23bin.demo.domain.mapping
包下創(chuàng)建:
<?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>
<!-- name 屬性:持久化類的全路徑 -->
<!-- table 屬性:表的名稱 -->
<class name="cn.god23bin.demo.domain.entity.User" table="user">
<!-- 主鍵 -->
<id name="id" column="id" type="java.lang.Integer">
<!-- 主鍵生成策略 -->
<generator class="native"/>
</id>
<!-- type 屬性 的三種寫法 -->
<!-- 1. Java類型 :java.lang.String -->
<!-- 2. Hibernate類型:string -->
<!-- 3. SQL類型 :不能直接使用type屬性,需要子標(biāo)簽<column> -->
<!-- <column name="name" sql-type="varchar(20)"/> -->
<property name="name" column="name" type="string" not-null="true" length="50"/>
<property name="password" column="password" not-null="true" length="50"/>
</class>
</hibernate-mapping>
注意:映射文件的編寫需要按照持久化類來(lái)編寫,而不是數(shù)據(jù)庫(kù)表。
cn.god23bin.demo.domain.entity.User 稱為全路徑 | 全限定類名 | 全限定名 | 全包名,反正我是見(jiàn)過(guò)多種叫法的,指的都是同個(gè)東西。
如果映射文件中沒(méi)有配置 column 和 type 屬性,那么 Hibernate 會(huì)默認(rèn)使用持久化類中的屬性名和屬性類型去匹配數(shù)據(jù)庫(kù)表中的字段。
創(chuàng)建完這個(gè)映射文件后,我們需要在配置文件中 <session-factory>
里指定該映射文件所在的位置,這樣 Hibernate 才知道映射文件在哪里。
<mapping resource="cn/god23bin/demo/domain/mapping/User.hbm.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.url">jdbc:mysql://localhost:3306/demo_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 映射文件所在位置 -->
<mapping resource="cn/god23bin/demo/domain/mapping/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
配置 pom.xml
由于我是 Maven 來(lái)構(gòu)建項(xiàng)目的,所以需要新增一個(gè)配置,便于讓 Hibernate 能夠找到 Maven 工程編譯后的 *.hbm.xml
映射文件。
在 pom.xml 中,找到 build 標(biāo)簽,在里面加上如下的配置:
<build>
...
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
Hibernate 工具類
Hibernate 有 3 個(gè)需要知道的類,不知道現(xiàn)在你還記不記得,不記得就翻到上面簡(jiǎn)介那里看看。
其中,Session 是持久化操作的核心類,通過(guò)它可以實(shí)現(xiàn) CRUD 操作。那么如何獲取 Session 對(duì)象呢?顯而易見(jiàn),就是通過(guò) Session 工廠,即 SessionFactory 對(duì)象,來(lái)獲取 Session 對(duì)象,那問(wèn)題又來(lái)了,Session 工廠如何獲?。?/p>
這里就得說(shuō)到 Configuration 配置類了,通過(guò)它創(chuàng)建 SessionFactory 對(duì)象,進(jìn)而獲取 Session 對(duì)象。
核心代碼是這樣的:
// 讀取 hibernate.cfg.xml 配置文件并創(chuàng)建 SessionFactory
Configuration configure = new Configuration().configure(); // 加載配置文件,configure() 方法可以指定配置文件所在位置,沒(méi)有指定的話,默認(rèn)為項(xiàng)目的 classpath 根目錄下的 hibernate.cfg.xml
SessionFactory sessionFactory = configure.buildSessionFactory(); // 創(chuàng)建 SessionFactory 對(duì)象
一般情況下,我們會(huì)寫一個(gè)工具類來(lái)獲取 Session 對(duì)象,如下:
package cn.god23bin.demo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* @author god23bin
*/
public class HibernateUtil {
/**
* 一個(gè) ThreadLocal 變量,用于存儲(chǔ)線程局部變量 Session。
* ThreadLocal 提供了線程局部變量的機(jī)制,保證每個(gè)線程都有自己的 Session 實(shí)例。
*/
private static final ThreadLocal<Session> THREAD_LOCAL = new ThreadLocal<>();
private static SessionFactory sessionFactory;
static {
try{
// 讀取 hibernate.cfg.xml 配置文件并創(chuàng)建 SessionFactory
Configuration configure = new Configuration().configure();
sessionFactory = configure.buildSessionFactory();
} catch (Exception e) {
System.err.println("Hibernate 創(chuàng)建會(huì)話工廠失??!");
e.printStackTrace();
}
}
/**
* 獲取 Session 對(duì)象
*/
public static Session getSession() {
Session session = THREAD_LOCAL.get();
if (session == null || session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
THREAD_LOCAL.set(session);
}
return session;
}
/**
* 重新創(chuàng)建會(huì)話工廠
*/
private static void rebuildSessionFactory() {
try{
// 讀取 hibernate.cfg.xml 配置文件并創(chuàng)建 SessionFactory
Configuration configure = new Configuration().configure();
sessionFactory = configure.buildSessionFactory();
} catch (Exception e) {
System.err.println("Hibernate 創(chuàng)建會(huì)話工廠失敗!");
e.printStackTrace();
}
}
/**
* 返回唯一的會(huì)話工廠對(duì)象
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* 關(guān)閉 Session 對(duì)象
*/
public static void closeSession() {
Session session = THREAD_LOCAL.get();
THREAD_LOCAL.remove();
if (session != null) {
session.close();
}
}
}
測(cè)試
創(chuàng)建一張 user 表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(50) NOT NULL COMMENT '名稱',
`password` varchar(50) NOT NULL COMMENT '密碼',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
編寫一個(gè)測(cè)試類,由于我這里是 Maven 項(xiàng)目,按照約定,測(cè)試類放在 /src/test/java/
目錄下,我這里就把這個(gè)測(cè)試類 HibernateTest
放在 java
目錄下的 cn.god23bin.demo
包中:
package cn.god23bin.demo;
import cn.god23bin.demo.domain.entity.User;
import cn.god23bin.demo.util.HibernateUtil;
import org.hibernate.Session;
import org.junit.Test;
/**
* @author god23bin
*/
public class HibernateTest {
@Test
public void test() {
// 獲取 Session 對(duì)象
Session session = HibernateUtil.getSession();
User user = new User();
user.setName("god23bin");
user.setPassword("123456");
try {
// 開(kāi)啟事務(wù),即使是執(zhí)行一次數(shù)據(jù)庫(kù)操作,也是事務(wù)
session.beginTransaction();
// 執(zhí)行插入操作
session.save(user);
// 提交事務(wù)
session.getTransaction().commit();
} catch (Exception e) {
// 發(fā)生異常,則回滾事務(wù)
session.getTransaction().rollback();
System.out.println("插入U(xiǎn)ser數(shù)據(jù)失??!");
e.printStackTrace();
} finally{
// 關(guān)閉 Session 對(duì)象
HibernateUtil.closeSession();
}
}
}
控制臺(tái)輸出:
五月 07, 2023 11:52:13 下午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.6.14.Final
五月 07, 2023 11:52:15 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
五月 07, 2023 11:52:17 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
五月 07, 2023 11:52:17 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/demo_hibernate]
五月 07, 2023 11:52:17 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=****}
五月 07, 2023 11:52:17 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
五月 07, 2023 11:52:17 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sun May 07 23:52:17 CST 2023 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
五月 07, 2023 11:52:18 下午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
五月 07, 2023 11:52:20 下午 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
insert
into
user
(name, password)
values
(?, ?)
Process finished with exit code 0
我們可以查看數(shù)據(jù)庫(kù)中 User 表中是否存在我們剛剛插入的數(shù)據(jù),可以發(fā)現(xiàn)是存在的:
總結(jié)
我們依次說(shuō)明了什么是 ORM,并且梳理了 JPA 和 ORM的關(guān)系以及 JPA 和 Hibernate 的關(guān)系。
我相信還是有很多人沒(méi)有搞清楚它們之間的聯(lián)系的,就只是學(xué)了而已,或者說(shuō)學(xué)過(guò)而已,當(dāng)然,也有的人說(shuō),知道了它們的關(guān)系又能怎樣呢?我不知道我也能用 Hibernate 去操作數(shù)據(jù)庫(kù)。話雖如此,但是我認(rèn)為明白它們之間的聯(lián)系,是有利于我們后續(xù)其他知識(shí)的學(xué)習(xí)的,也能跟其他知識(shí)建立起聯(lián)系,而不是單獨(dú)的一個(gè)知識(shí)孤島。
接著介紹了 Hibernate,以及如何使用 Maven 項(xiàng)目去構(gòu)建一個(gè)具有 Hibernate 的 Web 應(yīng)用,畢竟咱們開(kāi)發(fā),基本都是 Web 應(yīng)用程序。
使用 Maven 去構(gòu)建,就需要引入相關(guān)的依賴,Hibernate 的核心依賴以及數(shù)據(jù)庫(kù)驅(qū)動(dòng)的依賴,接著需要編寫配置文件、持久化類、持久化類的映射文件,最后寫一個(gè)獲取 Session 對(duì)象的工具類,便于我們獲取 Session 對(duì)象執(zhí)行數(shù)據(jù)庫(kù)操作。
以上,就是本篇文章的內(nèi)容,現(xiàn)在恭喜你已經(jīng)入門 Hibernate 了!是不是很快上手了!哈哈哈
最后的最后
希望各位屏幕前的靚仔靚女們
給個(gè)三連!你輕輕地點(diǎn)了個(gè)贊,那將在我的心里世界增添一顆明亮而耀眼的星!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-437586.html
咱們下期再見(jiàn)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437586.html
到了這里,關(guān)于一文快速入門體驗(yàn) Hibernate的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!