hibernate介紹:
Hibernate是一個開源的對象關系映射框架,它對JDBC進行了輕量級的對象封裝,使Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
它不僅提供了從java類到數據庫表之間的映射,也提供了數據查詢和恢復機制。相對於使用JDBC和SQL來手工操作數據庫,Hibernate可以大大減少
操作數據庫的工作量。另外Hibernate可以利用代理模式簡化載入類的過程,這將大大減少利用Hql從數據庫提取數據的代碼編寫量,從而節約開發時間
和開發成本Hibernate可以和多種web服務器或者應用服務器良好集成,如今已經支持幾乎所有的流行數據庫服務器。
2. Hibernate原理:
Hibernate技術本質上是一個提供數據庫服務的中間件。Hibernate的工作原理,他是利用數據庫以及其他一些配置文件如:hibernate.cfg.xml,
xxx.hbm.xml等來為應用程序提供數據持久化服務的。
- Configuration來讀取hibernate.cfg.xml文件
- 使用Configuration對象創建SessionFactory
- 用SessionFactory來打開一個Session
- 創建事務Transaction
- begin事務
- 使用Session進行數據庫操作
- 關閉或回滾事務
- 關閉Session
3. 配置Hibernate 聲明:我使用的是JDK1.7,Hibernate3.6.0
3.1 導入相關Jar包:Hibernate模式不只是自己內部實現,同樣也導入了許多外部的jar包,下面是Hibernate3.6.0框架的基本jar包
我使用的是mysql數據庫,可以根據自己使用的數據庫添加相關驅動Jar包
3.2 先創建一個User實體
1 package com.a_helloworld; 2 3 public class User { 4 5 private int id; 6 private String name; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 20 @Override 21 public String toString() { 22 return "User [id=" + id + ", name=" + name + "]"; 23 } 24 25 26 }
3.3 配置User實體在數據庫表的映射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 package="com.a_helloworld"> <!-- 屬性table 表示在數據庫中的表名 --> <class name="User" table="user_1" > <id name="id" column="id" type="int"> <!-- 值native表示會根據數據庫來創建不同的主鍵生成策略 --> <generator class="native"></generator> </id> <property name="name" column="name" type="string"></property> </class> </hibernate-mapping>
3.4 簡單配置hibernate.cfg.xml配置文件,這個文件名可以隨便修改(xxx.cfg.xml),但是沒多大意義,一般不建議修改。配置的信息如下:
1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 4 5 <hibernate-configuration> 6 <session-factory name="foo"> 7 8 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="connection.username">root</property> 10 <property name="connection.password">123456</property> 11 <property name="connection.url">jdbc:mysql:///user</property> 12 13 <!-- 要根據自己使用的數據庫來配置相對應的屬性,也成方言,針對不同數據庫 14 關於怎么配置可以查看HibernateAPI 15 --> 16 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 17 18 <!-- Hibernate 創建的SQL語句會顯示在控制台 --> 19 <property name="hibernate.show_sql">true</property> 20 21 <!-- 選擇方案,常用值:validate | update | create | create-drop --> 22 <property name="hbm2ddl.auto">update</property> 23 24 <mapping resource="com/a_helloworld/user.hbm.xml"/> -- 導入實體映射配置,程序每次啟動都會自動檢索 25 26 </session-factory> 27 </hibernate-configuration>
以上Hibernate簡單配置已經基本完成,可以添加一個測試類來測試是否成功
package com.a_helloworld; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.Session; import org.junit.Test; public class Demo { private static SessionFactory sf = new Configuration()// .configure("hibernate.cfg.xml")// .buildSessionFactory(); @Test public void addUser(){ Session session = null; Transaction tran = null; try{ session = sf.openSession(); // 創建一個Session
tran = session.beginTransaction(); //開啟事務
User user = new User(); user.setName("張三"); session.save(user); tran.commit();//事務提交
}catch(Exception e){ tran.rollback(); //事務回滾
throw(e); }finally{ session.close(); //關閉session
} } @Test public void getUser(){ Session session = null; Transaction tran = null; try{ session = sf.openSession(); // 創建一個Session
tran = session.beginTransaction(); //開啟事務
/*這里指明你要獲得哪個類型,Hibernate會根據類名查詢映射配置文件到數據庫查詢哪張表,根據指定 * id查詢實體,通過反射機制創建實體對象 */ User user = (User) session.get(User.class, 1); //執行查詢,get
tran.commit();//事務提交
}catch(Exception e){ tran.rollback(); //事務回滾
throw(e); }finally{ session.close(); //關閉session
} } @Test public void updateUser(){ Session session = null; Transaction tran = null; try{ session = sf.openSession(); // 創建一個Session
tran = session.beginTransaction(); //開啟事務
User user = new User(); user.setId(1);//這里指定了要更新的數據id為1
user.setName("李四");// 把名字 “張三” 修改為 “李四”
session.update(user);//執行更新
tran.commit();//事務提交
}catch(Exception e){ tran.rollback(); //事務回滾
throw(e); }finally{ session.close(); //關閉session
} } @Test public void deleteUser(){ Session session = null; Transaction tran = null; try{ session = sf.openSession(); // 創建一個Session
tran = session.beginTransaction(); //開啟事務
User user = new User(); user.setId(1);//這里指定了要更新的數據id為1
session.delete(user); //執行刪除
tran.commit();//事務提交
}catch(Exception e){ tran.rollback(); //事務回滾
throw(e); }finally{ session.close(); //關閉session
} } }
如需轉載請說明出處:http://www.cnblogs.com/gudu1/p/6879990.html