淺談hibernate+入門實例
來自: http://blog.csdn.net/u010850027/article/details/50799550
Hibernate是對jdbc進一步的封裝,隨著項目的開展,小編開始接觸到這個概念,一開始接觸的時候并沒有覺得hibernate有多神秘,沒有進一步的研究,只是簡單的知道她是對jdbc的進一步的封裝,可是這并不是學習的目的,到了目前這個學習的階段,所有的知識都應該精益求精,而不僅僅是停留在知道和使用這個層面上,那么hibernate是什么?她是干什么的?為什么會出現hibernate?她又有著怎么樣的優缺點呢?今天這篇博文小編就從這幾個方面對hibernate進行一個簡單的總結,希望對有需要的小伙伴有幫助,還請小伙伴們多多指教哦`(*∩_∩*)′!
Hibernate是什么?
Hibernate是一個開放源代碼的對象關系映射框架,她對JDBC進行了非常輕量級的對象封裝,使得java程序員可以隨心所欲的使用對象編程思維來操縱數據庫,hibernate可以應用在任何使用JDBC的場合,既可以在java的客戶端程序使用,也可以在Servlet/jsp中的Web應用中使用,最具革命意義的,hibernate可以在應用的EJB的j2ee架構中取代cmp,完成數據持久化的重任。
有意思的是hibernate翻譯成中文的意思是冬眠,雖然現在已經是三月份,但是北方依舊是冷颼颼的`(*∩_∩*)′,冬眠嘛,需要睡很長的時間,這就跟我們的持久化不謀而合,持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制,通俗的講,就是好瞬時數據(比如內存中的數據,是不能永久保存的)持久化為持久數據(比如持久化至數據庫中,能夠長久保存)。在我們的實際生活中,也有很多持久化的方法,比如說,我們會將鮮肉冷藏,吃的時候再解凍;將水果做成罐頭的方法也是;將人的臟器迅速冷凍,運輸,然后解凍給人移植的技術也是。
hibernate怎么用?
Hibernate主要用來實現Java對象和表之間的映射,除此之外還提供還提供數據查詢和獲取數據的方法,可以大幅度減少開發時人工使用SQL和JDBC處理數據的時間。hibernate的目標是對于開發者通常的數據持久化相關的編程任務,解放其中的百分之九十五,對于以數據為中心的程序來說,她們往往只在數據庫中使用存儲過程來實現商業邏輯,hibernate可能不是最好的解決方法,對于那些在基于java的中間層應用中,她們實現面向對象業務模型中和商業邏輯的應用,hibernate是最有用的,hibernate可以幫助我們消除或者包裝那些針對特定廠商的SQL代碼并且幫你把結果集從表格格式的表示形式轉換到一系列的對象去。如下一張簡單的圖,我們來看一下hibernate的工作原理:

結合上面的執行過程圖,小編來簡單的描述一下hibernate的運行過程,首先,應用程序先調用Configration類,該類讀取hibernate的配置文件及映射文件中的信息,并用這些信息生成一個SessionFactory對象,接著,從SessionFacctory對象生成一個Session對象,并用Session對象生成Transaction對象,可通過Session對象的get()、load()、sava()、update()、delete()和saveOrupdate()等方法對PO進行加載,保存,更新,刪除等操作;在查詢的情況下,可通過Session對象生成一個Query對象,然后利用Query對象執行查詢操作,如果沒有異常,Transaction對象將提交這些操作結果到數據庫中。
Hibernate的優缺點
優點:
一、更加對象化
以對象化的思維操作數據庫,我們只需要操作對象就可以了,開發更加對象化。
二、移植性
因為Hibernate做了持久層的封裝,你就不知道數據庫,你寫的所有的代碼都具有可復用性。
三、Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們稱為輕量級框架。對比Struts的Action和ActionForm,都需要繼承,離不開Struts。Hibernate不需要繼承任何類,不需要實現任何接口。這樣的對象叫POJO對象。測試更加方便,提高了效率。
缺點:
一、由于對持久層封裝過于完整,導致開發人員無法對SQL進行優化,無法靈活使用JDBC的原生SQL,Hibernate封裝了JDBC,所以沒有JDBC直接訪問數據庫效率高。要使用數據庫的特定優化機制的時候,不適合用Hibernate
二、框架中使用ORM原則,導致配置過于復雜,一旦遇到大型項目,比如300張表以上,配置文件和內容是非常龐大的,另外,DTO滿天飛,性能和維護問題隨之而來
三、如果項目中各個表中關系復雜,表之間的關系很多,在很多地方把lazy都設置false,會導致數據查詢和加載很慢,尤其是級聯查詢的時候。
四、Hibernate在批量數據處理時有弱勢,對于批量的修改,刪除,不適合用Hibernate,這也是ORM框架的弱點。接著,結合小編目前的項目,做一個簡單的實例,來幫助我們更好的來理解hibernate。
Hibernate實例
首先,第一步建議實體類User.java,具體代碼如下所示:
package com.liang.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
} 第二步,提供User.hbm.xml文件,完成類映射,具體代碼如下所示:
<span style="font-size:12px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--生成默認為user的數據庫表-->
<class name="com.liang.hibernate.User">
<id name="id">
<!-- 算法的核心思想是結合機器的網卡、當地時間、一個隨機數來生成GUID -->
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime" type="date"></property>
<property name="expireTime" type="date"></property>
</class>
</hibernate-mapping></span> 第三步,將User.hbm.xml文件加入到hibernate.cfg.xml文件中,代碼如下所示: <!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 設置數據庫URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 數據庫用戶名 -->
<property name="hibernate.connection.username">root</property>
<!-- 數據庫密碼 -->
<property name="hibernate.connection.password">123456</property>
<!-- 指定對應數據庫的方言,hibernate為了更好適配各種關系數據庫,針對每種數據庫都指定了一個方言dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 映射文件 -->
<mapping resource="com/liang/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration> 第四步,編寫工具類ExportDB.java,將hbm生成ddl,也就是hbm2ddl,代碼如下所示:
package com.liang.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* 將hbm生成ddl
* @author liang
*
*/
public class ExportDB{
public static void main(String[]args){
//默認讀取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
////生成并輸出sql到文件(當前目錄)和數據庫
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
} 測試之前,要提前建立數據庫hibernate_first,測試如下;控制臺打印的SQL語句:
drop table if exists User create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime date, expireTime date, primary key (id))數據庫表結構,如下圖所示:

建立客戶端類Client,添加用戶數據到mySQL
package com.liang.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Client {
public static void main(String[]args){
//讀取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//建立SessionFactory
SessionFactory factory =cfg.buildSessionFactory();
//取得session
Session session = null;
try{
//開啟session
session = factory.openSession();
//開啟事務
session.beginTransaction();
User user = new User();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存User對象
session.save(user);
//提交事務
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
session.getTransaction().rollback();
}finally{
if(session != null){
if(session.isOpen()){
//關閉session
session.close();
}
}
}
}
} 右鍵debug運行,測試完成之后,我們查詢一下測試結果:
小編寄語:該博文,小編主要簡單的介紹了一下hibernate,以及hibernate的一個簡單的實例,從例子我們可以看出來,我們只是使用Hibernate對User這一個實體進行了映射,比較簡單,但是完全不符合實際。如何像關系型數據庫一樣表示多種關聯關系,例如:一對一,一對多,多對多等等,我們還需要深入。下篇博文,我們介紹Hibernate的基本映射原理以及關聯關系映射。同樣的在代碼中沒有涉及到任何有關JDBC的代碼,作為開發人員只需要寫好相應的實體類,然后通過配置就可以實現了表的建立以及向表中實現數據的插入。在代碼中有許多Hibernate的核心對象,例如Configuration、SessionFactory、Session等等,在后面的博文中小編會陸續的介紹,盡請期待`(*∩_∩*)′!