1. 程式人生 > 其它 >Hibernate的介紹及入門小案例

Hibernate的介紹及入門小案例

1、Hibernate的誕生

    在以前使用傳統的JDBC開發應用系統時,如果是小型應用系統,並不覺得有什麼麻煩,但是對於大型應用系統的開發,使用JDBC就會顯得力不從心,例如對幾十,幾百張包含幾十個欄位的資料表進行增刪改查時,編寫的SQL語句不但很長,而且繁瑣,容易出錯;
在讀取資料時,需要些多條getXXX語句從結果集中取出各個欄位的資訊,不但枯燥重複,並且工作量非常大。
2001年,澳大利亞墨爾本一位名為Gavin King的27歲的程式設計師,上街買了一本SQL程式設計的書,他厭倦了實體bean,認為自己可以開發出一個符合物件關係對映理論,並且真正好用的Java持久化層框架,因此他需要先學習一下SQL。於是,在這一年的11月,Hibernate的第一個版本釋出了。


英文:Icame,Isaw,Iconquered 中文:我來,我見,我征服!!!  --愷撒大帝 (ps:天才對待問題總是如此)

Hibernate官網地址:http://hibernate.org/orm

2、Hibernate的介紹及核心

2.1 Hibernate的介紹

Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,它將java物件與資料庫表建立對映關係,是一個全自動的orm框架。Hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用。我這裡從三個角度來了解Hibernate:


(1)Hibernate是對JDBC進一步封裝​

原來沒有使用Hiberante做持久層開發時,存在很多冗餘,如:各種JDBC語句,所以出現了Hibernate把JDBC封裝了一下,我們不用操作資料,直接操作它就行了。

(2)從分層的角度來看

我們知道非常典型的三層架構:表示層,業務層,還有持久層。Hiberante也是持久層的框架,而且持久層的框架還有很多,比如:MyBatis,JDO,OJB,EJB等等。

3)Hibernate是開源的一個ORM(物件關係對映)框架

ORM,即Object-Relational Mapping,它的作用就是在關係型資料庫和物件之間做了一個對映。從物件(Object)對映到關係(Relation),再從關係對映到物件。
這樣我們在操作資料庫的時候,不需要再去和複雜SQL打交道,只要像操作物件一樣操作它就可以了(把關係資料庫的欄位在記憶體中對映成物件的屬性),而hibernate就是做到了自動將物件資料儲存到資料庫,將資料庫資料讀入到物件中。

2.2 Hibernate的核心

從上圖中,我們可以看出Hibernate六大核心介面,兩個主要配置檔案,以及他們直接的關係。在這裡我們從上到下簡單的認識一下,每個介面進行一句話總結。

1./Configuration介面:負責配置並啟動Hibernate

2. //SessionFactory介面:負責初始化Hibernate

3.//Session介面:負責持久化物件的CRUD操作

4.//Transaction介面:負責事務

5.//Query介面和Criteria介面:負責執行各種資料庫查詢

3. 入門小案例

3.1 建立表

3.2 匯入jar包

3.3建立實體類

package com.qf.entity;

public class User {
private int id;
private String userId;
private String password;
private String userName;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "net.biancheng.www.po.User{" +
"id=" + id +
", userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
}

3.4 建立對映檔案

<?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="com.qf.entity.User" table="user" schema="bianchengbang_jdbc">
<!-- 主鍵-->
<id name="id" column="id">
<!--主鍵生成策略-->
<generator class="native"></generator>
</id>
<!--type:三種寫法-->
<!--Java型別 :java.lang.String-->
<!--Hibernate型別:string-->
<!--SQL型別 :不能直接使用type屬性,需要子標籤<column>-->
<!--<column name="name" sql-type="varchar(20)"/>-->
<property name="userId" column="user_id" type="java.lang.String"/>
<property name="userName" column="user_name"/>
<property name="password" column="password"/>
<property name="email" column="email"/>
</class>
</hibernate-mapping>

3.5 編寫連線資料庫的配置檔案

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--使用 Hibernate 自帶的連線池配置-->
<property name="connection.url">jdbc:mysql://localhost:3306/java2109</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--hibernate 方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--列印sql語句-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql-->
<property name="hibernate.format_sql">true</property>
<!-- 載入對映檔案 -->
<mapping resource="com/qf/mapping/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

3.6 建立測試類

package com.qf.test;

import com.qf.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.Test;
import java.util.List;
public class MyTest {
/**
* 查詢資料庫資料
*/
@Test
public void testQuery() {
//Hibernate 載入核心配置檔案(有資料庫連線資訊)
Configuration configuration = new Configuration().configure();
//建立一個 SessionFactory 用來獲取 Session 連線物件
SessionFactory sessionFactory = configuration.buildSessionFactory();
//獲取session 連線物件
Session session = sessionFactory.openSession();
//開始事務
Transaction transaction = session.beginTransaction();
//根據主鍵查詢 user 表中的記錄
User user = session.get(User.class, 2);
System.out.println(user);
//提交事務
transaction.commit();
//釋放資源
session.close();
sessionFactory.close();
}
}

3.7 測試結果(自動生成了sql語句)

Hibernate: 
select
user0_.id as id1_0_0_,
user0_.user_id as user_id2_0_0_,
user0_.user_name as user_nam3_0_0_,
user0_.password as password4_0_0_,
user0_.email as email5_0_0_
from
user user0_
where
user0_.id=?
net.biancheng.www.po.User{id=2, userId='002', userName='李四', password='456', email='[email protected]'}