Hibernate是一個開源的ORM框架,顧名思義,它的核心思想即ORM(Object Relational Mapping,對象關係映射),可以通過對象來操作資料庫中的信息,據說開發者一開始是不太熟悉資料庫SQL語句的,這也造就了hibernate的強大之處,它不強求開發者熟悉SQL語句也可以操作 ...
Hibernate是一個開源的ORM框架,顧名思義,它的核心思想即ORM(Object Relational Mapping,對象關係映射),可以通過對象來操作資料庫中的信息,據說開發者一開始是不太熟悉資料庫SQL語句的,這也造就了hibernate的強大之處,它不強求開發者熟悉SQL語句也可以操作資料庫,hibernate可以自動生成SQL語句,自動執行。
利用hibernate可以讓開發者完全使用面想對象思維來操作資料庫,所以接下來的演示不會有一句SQL語句,如果有的話,請當我這句話沒說!
本文使用hibernate實現了簡單的對一個person數據表的基本增刪改查操作。
準備工作
環境:win7+eclipse
工具包:hibernate包,可前往http://hibernate.org/orm/downloads/下載,本例中使用的是4版本;
資料庫連接驅動包,本例中使用的是mysql的
程式結構圖示
pojo層實體類
package demo.pojo; public class Person { private Integer id; private String name; private String gender; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]"; } }
核心配置文件hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 以下四行分別為:資料庫驅動類、Drivermanager獲取連接的參數URL、用戶名、密碼 --> 8 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 9 <property name="connection.url">jdbc:mysql://127.0.0.1/web?characterEcoding=utf-8</property> 10 <property name="connection.username">root</property> 11 <property name="connection.password">123456</property> 12 <!-- 設置方言,hibernate會根據資料庫的類型相應生成SQL語句 --> 13 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 14 15 <!-- 控制台顯示生成的sql語句,預設為false --> 16 <property name="show_sql">true</property> 17 <!-- 映射配置源文件的位置 --> 18 <mapping resource="demo/pojo/Person.hbm.xml"/> 19 </session-factory> 20 21 </hibernate-configuration>
映射文件Person.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- name是實體類全名,table為數據表名 --> 7 <class name="demo.pojo.Person" table="Person"> 8 <id name="id" column="id"> 9 <!-- 主鍵生成方式,native是讓hibernate自動識別 --> 10 <generator class="native"></generator> 11 </id> 12 <!-- 13 註意點: 14 0.name值為實體類中屬性名,column為數據表中欄位名; 15 1.當實體類中屬性名與對應數據表欄位名相同時,後面的column可以省略,hibernate會自動匹配,例如下麵age ; 16 2.反之當實體類中屬性名與對應數據表欄位名不相同時,兩項都要寫上,例如下麵gender和sex 17 --> 18 <property name="name" column="name"></property> 19 <property name="gender" column="sex"></property> 20 <property name="age"></property> 21 </class> 22 </hibernate-mapping>View Code
Session工廠類
1 package demo.util; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.hibernate.service.ServiceRegistry; 7 import org.hibernate.service.ServiceRegistryBuilder; 8 9 public class HibernateSessionFactory { 10 private static SessionFactory factory; 11 private static ThreadLocal<Session> thread = new ThreadLocal<Session>(); 12 private static String path = "hibernate.cfg.xml"; 13 private static Configuration config = new Configuration(); 14 static { 15 config.configure(path); 16 ServiceRegistry service = new ServiceRegistryBuilder()//定義一個服務註冊機 17 .applySettings(config.getProperties()).buildServiceRegistry(); 18 factory = config.buildSessionFactory(service);//創建Session工廠類 19 } 20 21 public static Session getSession() { 22 Session session = thread.get(); 23 if(session == null || !session.isOpen()) { 24 session = factory.openSession(); 25 thread.set(session); 26 } 27 return session; 28 } 29 30 public static void closeSession() { 31 Session session = thread.get(); 32 if(session != null && session.isOpen()) { 33 session.close(); 34 thread.set(null); 35 } 36 } 37 38 }View Code
DAO層封裝數據各項操作的方法
1 package demo.dao; 2 3 import java.io.Serializable; 4 import org.hibernate.Session; 5 import org.hibernate.Transaction; 6 import demo.pojo.Person; 7 import demo.util.HibernateSessionFactory; 8 9 public class PersonDaoImpl { 10 //增刪改查,此處以增為例 11 public boolean add(Person p) { 12 Session session = HibernateSessionFactory.getSession();//創建Session 13 Transaction trans = session.beginTransaction();//開啟事務 14 try { 15 Serializable id = session.save(p);//添加記錄並獲取主鍵值 16 System.out.println(id+"為獲取的主鍵值");//控制台查看主鍵值 17 trans.commit();//提交事務 18 return true; 19 } catch (Exception e) { 20 trans.rollback();//獲取異常,則事務回滾 21 } finally { 22 HibernateSessionFactory.closeSession();//關閉Session 23 } 24 return false; 25 } 26 }View Code
測試類TestPerson
1 package demo.test; 2 3 import org.junit.Test; 4 import demo.dao.PersonDaoImpl; 5 import demo.pojo.Person; 6 7 public class TestPerson { 8 @Test 9 public void testAdd() { 10 //創建一個人類對象 11 Person p = new Person(); 12 p.setName("張三"); 13 p.setGender("男"); 14 p.setAge(18); 15 //創建dao層類對象並調用添加方法 16 PersonDaoImpl dao = new PersonDaoImpl(); 17 dao.add(p); 18 } 19 }View Code