首先來說我個人感覺這篇博客寫的沒有絲毫的技術可言,只是代碼占據了我博文相當長的篇幅,這樣是空間的極大浪費,我個人感覺假如我是一個讀者的話我也不會去認真的看這些代碼去,但是還是會有一種人會看這些代碼,那就是真心想通過我的博客學習Hibernate的人。為了我親愛的讀者們,我做一次無聊的事情,那就是詳細解析代碼構造和Hibernate運行機制。
Hibernate的第一個實例來了解Hibernate是如何將對象實體映射成關系數據表和如何操作數據庫。
項目實例
1、創建java項目
注:src文件夾下是hibernate文件夾(子文件:Client.java、ExportDB.java、User.java和User.hbm.xml實體類映射文件)、hibernate.cfg.xml系統配置文件和log4j.properites文件
2、創建User Library,加入依賴包,可以自己研究一下,也可以直接下載直接加載進去。
* HIBERNATE_HOME/lib/*.jar
* HIBERNATE_HOME/hibernate3.jar
* 加入數據庫驅動(mysql驅動)
3、提供hibernate.cfg.xml文件,完成基本的配置
4.建立實體類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文件,完成實體類的映射
<!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>
注:標題4和標題5通過實體類和實體類映射文件形成數據庫中的字段,id采用的系統自動分配唯一主鍵,其余的都是屬性字段。
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這是配置數據庫的基本信息,下面的dialect是適配數據庫,mapping resource 指向的是實體類。
7、編寫工具類ExoprtDB.java,將hbm生成ddl,也就是hbm2ddl
* 將hbm生成ddl
* @author Administrator
*
*/
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);
}
}
8、建立客戶端類Client,添加用戶數據到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();
//開啟事務
session.beginTransaction();
User user = new User();
user.setName("張三");
user.setPassword("123");
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();
}
}
}
}
}
注:最好加入如下配置項,方便觀察hibernate sql的生成:
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
最好加入log4j配置文件,將該配置文件拷貝到src下,便于程序的調試
解析
第一個實例的運行原理解析:
1.通過Configuration().configure();//讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中<mapping resource ="com/bjpowernode/hibernate/User.hbm.xml"/>
3.通過config.buildSessionFactory(); //創建SessionFactory
4.sessionFactory.openSession();//打開
5.session.beginTransaction();//創建事務
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SessionFactory
總結
通過這個實例的演示,相比大家也能體會到Hibernate的好處吧!
1.對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復代碼
2.Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM。很大程度上簡化了DAO的編碼工作。
3.hibernate使用java反射機制,而不是字節碼增強程序來實現透明性。
4.hibernate的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
希望大家通過第一實例體會一下Hibernate的面向對象思想編程,以后我們通過uml對象圖和關于實體類映射文件的主要內容進行演示,以后不會再詳細演示代碼。
關于Hibernate如何將對象化的思維操作數據庫模型,請繼續關注我的博客,我會一一進行詳盡的解析。