之前我們用一個java類連接MySQL數據庫實現了數據庫的增刪改查操作---------MySQL篇;
但是數據庫種類之多,除了MySQL,還有Access、Oracle、DB2等等,而且每種數據庫語言都不盡相同;
這時,我們就需要一個框架來實現對主流數據庫操作的兼容,並且簡化操作流程,Hibernate就是其中一款
主流框架。這里我們用Myeclipse作為開發軟件來示例。
1.建立數據庫連接
開啟MySQL數據庫服務,並在Myeclipse中,Window-->Show View-->DB Browser,打開數據庫窗口;
右鍵New,這里要求你輸入你開啟的數據庫信息,並對其進行連接,因為我這里用的是MySQL,所以選擇
信息如下:
Driver template:MySQL Connecter/J;
Driver name:自定義,但是推薦使用和項目相關的名字;
Conection URL:jdbc:mysql://localhost:8090/eco(這里寫自己數據庫的地址);
Driver Jars:這里需要添加一個數據庫驅動,在這里是MySQL的JDBC驅動,提前下載好的;
然后就是用戶名、密碼了,如果信息無誤,那么連接成功。
2.新建java項目,並為其加入Hibernate特性
流程如下:
右鍵項目-->Myeclipse-->Add Hibernate Capabilities-->選擇版本,我這里選的是4.1版本,然后選擇Hibernate
的Core核心包,下一步;
選擇之前連接的數據庫-->在這里會生成一個hibernate.cfg.xml文件,當前存儲了數據庫的連接信息-->選擇一個
目錄來放置HibernateSessionFactory.java這個類-->finish。
這個類中的方法,會在后面的數據庫操作中用到,這里Hibernate已經幫我們寫好了,后面加以調用就OK了。
3.反向生成持久化類
數據庫中建立一張表table,並為其添加屬性字段,比如ID,name,age等等,在這里我們使用的是依靠表來
反向生成持久化類(和表中屬性相對應的類文件),表的信息設置好之后,右鍵表-->Hibernate Reverse Engineer;
這里會生成一個持久化類和關於類與表映射關系的XML文件,系統讓你選擇一個安放路徑,POJO<>DB字段打
鈎,表示項目到數據庫的映射-->Type類型:Java,ID字段(主鍵)的類型,我這里選的是assigned(手動輸入),
如果ID信息填的是學號的話,這樣就比較靠譜,如果沒有什么切實意義,那么選native,他會更具數據庫類別自
動匹配類型,MySQL就會是自增-->finish。
4.映射文件和數據庫信息文件
Student.hbm.xml
1 <hibernate-mapping> 2 <class name="student.Student" table="student" catalog="eco"> 3 <id name="id" type="java.lang.Integer"> 4 <column name="id" /> 5 <generator class="assigned" /> 6 </id> 7 <property name="user" type="java.lang.String"> 8 <column name="user" length="16" not-null="true" /> 9 </property> 10 <property name="password" type="java.lang.String"> 11 <column name="password" length="16" not-null="true" /> 12 </property> 13 <property name="age" type="java.lang.Integer"> 14 <column name="age" not-null="true" /> 15 </property> 16 </class> 17 </hibernate-mapping>
這表示了student包下的Student持久化類與數據庫表student的映射關系,property是持久化類中的成員變量,
column是數據庫表的屬性字段,它們一一對應,Id標簽表示這個字段是主鍵。
hibernate.cfg.xml
1 <session-factory> 2 <property name="dialect"> 3 org.hibernate.dialect.MySQLDialect 4 </property> 5 <property name="connection.url"> 6 jdbc:mysql://localhost:8090/eco 7 </property> 8 <property name="connection.username">root</property> 9 <property name="connection.password">root</property> 10 <property name="connection.driver_class"> 11 com.mysql.jdbc.Driver 12 </property> 13 <property name="myeclipse.connection.profile"> 14 mysqljdbc 15 </property> 16 17 <mapping resource="student/Student.hbm.xml" /> 18 </session-factory>
這是數據庫信息文件以及映射文件的注冊,其實property標簽還可以加幾個:
<property name="show_sql">true</property>表示進行數據庫操作時,在后台打印sql語句
<property name="fomat_sql">true</property>表示將打印的sql語句格式化
<property name="hbm2ddl.auto">create</property>添加記錄時對表的操作處理,create刪除新建,update更新
5.單元測試
這里來個插曲,就是單元測試,有了單元測試,我們就不用像以前那樣總是新建一個程序入口的main方法來運行
代碼功能了,可以選擇性的運行功能塊(方法)。
首先要為項目導入Junit單元測試工具的jar包,然后新建一個測試類;
1 public class StudentTest { 2 private Session session = HibernateSessionFactory.getSession(); 3 private Transaction transaction; 4 5 @Before 6 public void init() { 7 // 開啟事務 8 transaction = session.beginTransaction(); 9 } 10 11 @After 12 public void distory() { 13 // 提交事務 14 transaction.commit(); 15 // 關閉會話 16 session.close(); 17 // 關閉會話工廠 18 HibernateSessionFactory.getSessionFactory().close(); 19 } 20 21 @Test 22 public void testadd() { 23 // 事務具體內容 24 Student s = new Student(334, "桔子桑", "12646574", 26); 25 session.save(s); 26 } 27 28 }
我們來看這三個注解:
@Before 相當於初始化,我們在這個方法中實現了開啟事務;
@Test 在這里安排想要實現的功能,布置真正要做的事;
@After 相當於銷毀,在這里我們先把任務提交給數據庫,然后關閉會話/會話工廠,如果不關閉,隨着對數據庫連接
的次數增加,有可能導致連接池溢出,所以,我們在任務結束之后,關閉會話。
6.增刪改查
1 @Test 2 public void testadd() { 3 // 事務具體內容 4 Student s = new Student(334, "桔子桑", "12646574", 26); 5 session.save(s); 6 } 7 @Test 8 public void testupdate() { 9 // 事務具體內容 10 Student s = (Student)session.get(Student.class, 1); 11 s.setAge(25); 12 session.update(s); 13 } 14 @Test 15 public void testdelete() { 16 // 事務具體內容 17 Student s = (Student)session.get(Student.class, 1); 18 session.delete(s); 19 } 20 @Test 21 public void testget() { 22 // 事務具體內容 23 Student s = (Student)session.get(Student.class, 1); 24 System.out.println(s); 25 }
以上就是數據庫的增刪改查功能,是不是很方便呢,再也不用冥思苦想地去拼接sql語句了,
Student.class表示Student類的類類型,是java反射的知識。
溫馨提示:Hibernate版本不同,獲取會話工廠的方法也會有差異,本文使用的是4.1版本的Hibernate。