Follow Me:深入淺出學(xué)習(xí)Hibernate二:Hibernate第一實(shí)例
Posted on 2012-06-17 19:24 zljpp 閱讀(1083) 評(píng)論(0) 編輯 收藏首先來(lái)說(shuō)我個(gè)人感覺(jué)這篇博客寫(xiě)的沒(méi)有絲毫的技術(shù)可言,只是代碼占據(jù)了我博文相當(dāng)長(zhǎng)的篇幅,這樣是空間的極大浪費(fèi),我個(gè)人感覺(jué)假如我是一個(gè)讀者的話我也不會(huì)去認(rèn)真的看這些代碼去,但是還是會(huì)有一種人會(huì)看這些代碼,那就是真心想通過(guò)我的博客學(xué)習(xí)Hibernate的人。為了我親愛(ài)的讀者們,我做一次無(wú)聊的事情,那就是詳細(xì)解析代碼構(gòu)造和Hibernate運(yùn)行機(jī)制。
Hibernate的第一個(gè)實(shí)例來(lái)了解Hibernate是如何將對(duì)象實(shí)體映射成關(guān)系數(shù)據(jù)表和如何操作數(shù)據(jù)庫(kù)。
項(xiàng)目實(shí)例
1、創(chuàng)建java項(xiàng)目
注:src文件夾下是hibernate文件夾(子文件:Client.java、ExportDB.java、User.java和User.hbm.xml實(shí)體類(lèi)映射文件)、hibernate.cfg.xml系統(tǒng)配置文件和log4j.properites文件
2、創(chuàng)建User Library,加入依賴包,可以自己研究一下,也可以直接下載直接加載進(jìn)去。
* HIBERNATE_HOME/lib/*.jar
* HIBERNATE_HOME/hibernate3.jar
* 加入數(shù)據(jù)庫(kù)驅(qū)動(dòng)(mysql驅(qū)動(dòng))
3、提供hibernate.cfg.xml文件,完成基本的配置
4.建立實(shí)體類(lèi)User.java
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;
}
}
5、提供User.hbm.xml文件,完成實(shí)體類(lèi)的映射
<!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.bjpowernode.hibernate.User">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
注:標(biāo)題4和標(biāo)題5通過(guò)實(shí)體類(lèi)和實(shí)體類(lèi)映射文件形成數(shù)據(jù)庫(kù)中的字段,id采用的系統(tǒng)自動(dòng)分配唯一主鍵,其余的都是屬性字段。
6、將User.hbm.xml文件加入到hibernate.cfg.xml文件中
"-//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>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">bjpowernode</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<!--
<property name="hibernate.format_sql">true</property>
-->
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
注:大家看到driver_class、url、username和password這是配置數(shù)據(jù)庫(kù)的基本信息,下面的dialect是適配數(shù)據(jù)庫(kù),mapping resource 指向的是實(shí)體類(lèi)。
7、編寫(xiě)工具類(lèi)ExoprtDB.java,將hbm生成ddl,也就是hbm2ddl
* 將hbm生成ddl
* @author Administrator
*
*/
public class ExportDB {
public static void main(String[] args) {
//默認(rèn)讀取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
8、建立客戶端類(lèi)Client,添加用戶數(shù)據(jù)到mysql
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 = factory.openSession();
//開(kāi)啟事務(wù)
session.beginTransaction();
User user = new User();
user.setName("張三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存User對(duì)象
session.save(user);
//提交事務(wù)
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
//回滾事務(wù)
session.getTransaction().rollback();
}finally {
if (session != null) {
if (session.isOpen()) {
//關(guān)閉session
session.close();
}
}
}
}
}
注:最好加入如下配置項(xiàng),方便觀察hibernate sql的生成:
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
最好加入log4j配置文件,將該配置文件拷貝到src下,便于程序的調(diào)試
解析
第一個(gè)實(shí)例的運(yùn)行原理解析:
1.通過(guò)Configuration().configure();//讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中<mapping resource ="com/bjpowernode/hibernate/User.hbm.xml"/>
3.通過(guò)config.buildSessionFactory(); //創(chuàng)建SessionFactory
4.sessionFactory.openSession();//打開(kāi)
5.session.beginTransaction();//創(chuàng)建事務(wù)
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務(wù)
8.關(guān)閉Session
9.關(guān)閉SessionFactory
總結(jié)
通過(guò)這個(gè)實(shí)例的演示,相比大家也能體會(huì)到Hibernate的好處吧!
1.對(duì)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)代碼
2.Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM。很大程度上簡(jiǎn)化了DAO的編碼工作。
3.hibernate使用java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。
4.hibernate的性能非常好,因?yàn)樗且粋€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
希望大家通過(guò)第一實(shí)例體會(huì)一下Hibernate的面向?qū)ο笏枷刖幊蹋院笪覀兺ㄟ^(guò)uml對(duì)象圖和關(guān)于實(shí)體類(lèi)映射文件的主要內(nèi)容進(jìn)行演示,以后不會(huì)再詳細(xì)演示代碼。
關(guān)于Hibernate如何將對(duì)象化的思維操作數(shù)據(jù)庫(kù)模型,請(qǐng)繼續(xù)關(guān)注我的博客,我會(huì)一一進(jìn)行詳盡的解析。