1.概念
完成對象模型和關係模型轉換的開源框架
2.特點
(1)是一個開源的持久層輕量級框架(對操縱的組件沒有任何的侵入性)
(2)ORM:通過元數據進行數據模型和對象模型之間的轉換(將數據從一種狀態轉到另一種狀態)
(3)非常好的緩存機制:有一級緩存,二級緩存,和查詢緩存(介於一二級之間)提高緩存效率;
(4)對jdbc進行了輕量級的對象封裝(默認使用dbcp連接池技術)
(5)不僅提供了從Java類到數據表的映射,也提供了數據查詢和恢復機制(恢復/回滾)
(6)用配置文件的形式來定義對象和關係之間的映射
(7)使用HQL語句將複雜的關係算法用對象的方式描述(不再需要編寫繁瑣的sql語句)
3.hibernate架構
pojo:數據bean,不能實現任何接口或繼承任何類,也叫實體類
阻抗不匹配:數據在內存和內存外存放的形式不同
3.ORM(Object Relational Mapping)對象關係映射
ORM是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將java程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。
4.爲什麼要進行對象關係映射
(1)面向對象的開發方法是當今企業級應用開發環境中的主流開發方法
(2)關係數據庫是企業級應用環境中永久存放數據的主流數據存儲系統
5.對象關係映射模式
屬性映射,類映射,關聯映射:一對一,一對多,多對多
6.一些其它持久層框架
(1)Apache OJB
(2)SUN JDO (java數據對象)
(3)oracle Toplink
(4) EJB2 CMP
(5)EJB3 JPA (java持久化API)
(6)java提供 J持久化標準規範(hibernate也是遵從這種規範),SpringData Jpa是hibernate的一個子集;
(7)Apache iBitis (基FSQL映射的輕星級的個O/R Mapping的解決方案) : Apache itis遷移到google code改名爲MyBits;
(8) Gavin King hibernate 最流行的O/R Mapping工具。
好了,以上是對hibernate的一些基本概述,現在開始編寫一個使用hibernate框架的案例
1.環境的搭建
(1)先創建一個java項目
(2)build path,-->add library; -->User Library (取名任意,我的是hibernateJAR)
(3)添加jar包
主要jar包有:HIBERNATE HOME/hibernate3.jar ;HIBERNATE HOME/lib/*.jar ;
mySql jdbc驅動: mysql-connector-java-5.0.4-bin.jar
(需要相關jar包的夥伴可以評論留言,可以發送給你)
(4)創建hibernate配置文件hibernate.cfg.xml,爲了便於調試最好加入log4配置文件(放在src下面)
(5)創建一個包com.hibernate,創建一個User實體類(pojo)
package com.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
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;
}
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;
}
}
(6)創建元數據(映射文件) hmb.xml, 把實體類和數據庫關聯,命名爲實體類名.hmb.xml,且放在實體類的同-個包下;
(7)配置User.hbm.xml
<?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>
<!-- 映射表:指明實體類的包名+類名(類名就是數據庫的表名) -->
<class name="com.hibernate.User">
<!-- 映射主鍵:User類裏的屬性id,也是數據庫的主鍵 -->
<id name="id">
<!-- 主鍵生成策略,主鍵值自動生成,hibernate生成,人爲設定沒用 -->
<generator class="uuid"/>
</id>
<!-- 映射表裏的普通字段 :會自動轉化爲數據庫表字段相應的類型-->
<!-- eg:string映射爲varchar util,Date映射爲Datetime -->
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
(8)配置主配文件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>
<!-- 配置url,驅動名,用戶名,密碼 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_database</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 設置方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 特性配置(是否顯示sql語句) -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置,元數據的包名+文件名 -->
<mapping resource="com/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(9)利用Hibernate提供的工具類來創建數據庫表 編寫hbm2ddl工具類ExportDB
package com.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
public static void main(String[] args) {
//讀取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
SchemaExport export=new SchemaExport(cfg);
//創建表
export.create(true, true);
}
}
執行結果:在數據庫創建了相應的表(如下圖):
(10)編寫測試類,往User表裏添加一條記錄
package com.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Date;
public class Client {
public static void main(String[] args) {
//讀取hibernate.cfg.xml文件(若不調用configure,讀取的則是bibernate.properties文件)
Configuration cfg = new Configuration().configure();
//創建SessionFactory對象,即創建session工廠
//重量級,耗時,線程安全,一般在程序初始化時創建
SessionFactory factory=cfg.buildSessionFactory();
Session session = null;
try {
//創建Session,持久層管理器-完成持久化ORM,但線程不安全 ,有一級緩存,可以管理事務,管理連接
session=factory.openSession();
//開啓事物
session.beginTransaction();
User user=new User();
//不需要設置id值,設置了主鍵生成策略uuid ,由Hibernate生成主鍵
user.setName("wangwu");
user.setPassword("789");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存數據
/**
* session先通過user對象找到User類,
* 並在hibernate.cfg.xml文件裏找到對應的User.hmb.xml的映射文件
* 通過映射文件找到對應的表,將實體類中各個屬性的值存到表中對應的各個字段中
* eg:user對象的name屬性值"wangwu" 轉換成user表裏的name字段的記錄,類型爲varchar;
* createTime屬性值轉換成表裏的createTime:字段的記錄,類型爲datatime;
*
*/
session.save(user);
//提交事務,對提交數據庫的數據做確認,確認完整性
/**
*若沒提交事務,這些數據就是”髒數據"或者”垃圾數據
*因爲沒有確認數據,主鍵可能會與表裏的數據相同,所有這些數據暫時是無效;
*/
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
//回滾事務(數據不正確的時候)
session.getTransaction().rollback();
}finally{
if (session != null) {
if (session.isOpen()) {
session.close();//關閉session
}
}
}
}
}
結果(在User表中創建了一條記錄):
好了,第一個hibernate案例到此結束
通過使用hibernate框架,你是否也發現了它的巨大好處呢,下面我們就來總結一下
hibernate優點:
(1)提高生產力
不用再寫枯燥的jdbc語句了,代碼量會明顯的減少了,可提高代碼質量;
(2) 使開發更對象化了
只操作對象就可把數據存入到數據庫中;
(3)可移植性好
Hibernate會根據數據庫的不同利用適配器(方言)的配置自動的轉換成相應的sql語句
(4)支持透明持久化
業務對象沒有繼承任何對象,沒有實現任何接口(pojo對象,沒有侵入性), Hibernate就可以存到數據庫表中,Dao的不同實現,改動量不會很大;