Hibernate框架學(xué)習(xí)之增刪改查
前言
上一小節(jié)我們建立一個(gè)基于Maven的Hibernate工程,并且完成基本的配置,粗略地了解了Hibernate,接下來(lái)這一小節(jié),我們接著上一小節(jié)的內(nèi)容,利用Hibernate來(lái)完成簡(jiǎn)單的增上改查。
封裝工具類
為了操作的方面,首先先對(duì)Hibernate的基本操作進(jìn)行一個(gè)封裝,這樣可以提高開發(fā)的效率,減少重復(fù)代碼,封裝過(guò)程如下所示:
新建一個(gè)包,命名為Utils
新建一個(gè)類,命名為HibernateUtils
-
代碼抽取
// 獲取Hibernate的配置對(duì)象 Configuration configuration = new Configuration().configure(); // 建立SessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); // 打開session Session session = sessionFactory.openSession(); // 所要添加到數(shù)據(jù)庫(kù)的學(xué)生對(duì)象 Students students = new Students(); students.setAge(22); students.setName("xuhuanfeng"); // 開啟事務(wù) Transaction ts = session.beginTransaction(); // 將數(shù)據(jù)添加到數(shù)據(jù)庫(kù) session.save(students); // 提交事務(wù) ts.commit(); // 關(guān)閉對(duì)應(yīng)的連接 session.close(); sessionFactory.close();
上面的代碼是上一小節(jié)中使用到的代碼,從代碼中可以看到,前面幾行代碼都是重復(fù)性,也就是說(shuō),每次我們需要獲得一個(gè)Session對(duì)象的時(shí)候,都需要這些代碼,所以將其抽取出來(lái),形成工具類。
-
代碼封裝
/** * Hibernate 工具類 * Created by xuhuanfeng on 2017-04-06. */ public class HibernateUtils { private static SessionFactory sessionFactory; //私有化構(gòu)造器 private HibernateUtils(){} static { Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } // 獲得Session對(duì)象 public static Session openSession(){ return sessionFactory.openSession(); } }
增加操作
封裝好對(duì)應(yīng)的工具類之后,我們就可以開始增刪改查之旅了,首先是增加記錄。
增加記錄主要的使用到的方法是save方法,這個(gè)在上一小節(jié)中已經(jīng)了解過(guò)了,具體的操作代碼如下所示
// 增加一個(gè)記錄
@Test
public void testCreate(){
Session session = HibernateUtils.openSession();
// 所要添加到數(shù)據(jù)庫(kù)的學(xué)生對(duì)象
Students students = new Students();
students.setAge(30);
students.setName("tom");
// 開啟事務(wù)
Transaction ts = session.beginTransaction();
// 將數(shù)據(jù)添加到數(shù)據(jù)庫(kù)
session.save(students);
// 提交事務(wù)
ts.commit();
// 關(guān)閉對(duì)應(yīng)的連接
session.close();
}
需要注意的是,這里的事務(wù)是需要開啟的,save方法本質(zhì)上并沒(méi)有將數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,只有當(dāng)事務(wù)commit了之后才會(huì)同步到數(shù)據(jù)庫(kù)中。
運(yùn)行之后就可以觀察到,對(duì)應(yīng)的記錄已經(jīng)添加到數(shù)據(jù)庫(kù)中了。
查詢操作
接下來(lái)是查詢操作,主要分為查詢單一記錄以及查詢滿足條件的所有記錄,查詢操作是一個(gè)比較復(fù)雜的操作,這里只進(jìn)行簡(jiǎn)單的單表查詢,其他的查詢?cè)诤竺娴男」?jié)中。
-
單一記錄查詢
單一記錄主要是通過(guò)主鍵來(lái)獲取對(duì)應(yīng)的記錄,也就是通過(guò)配置了id的屬性來(lái)獲取記錄,使用get方法即可。
// 測(cè)試查詢 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 獲取指定id的記錄,這里的id指的是在元數(shù)據(jù)中配置<id>所對(duì)應(yīng)的元素 Students students = session.get(Students.class, 1); System.out.println(students); session.close(); }
Hibernate中同時(shí)還提供另外一種獲取單一記錄的方式,可以使用load方法,兩種方法的操作基本一樣,如下所示
// 測(cè)試查詢 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 獲取指定id的記錄,這里的id指的是在元數(shù)據(jù)中配置<id>所對(duì)應(yīng)的元素 Students students = session.load(Students.class,1); System.out.println(students); session.close(); }
這兩種方式的區(qū)別在于,get方法在查詢的時(shí)候就直接返回了所查詢記錄的全部?jī)?nèi)容,而load方法只是返回了具有該主鍵的對(duì)象,只有當(dāng)使用到該對(duì)象的時(shí)候,才會(huì)去完整地加載該對(duì)象,也就是懶操作/ 延遲操作。測(cè)試該效果的方式非常簡(jiǎn)單,只需要將load代碼中的
session.close();
與輸出的代碼交換位置,就可以看到(此時(shí)會(huì)拋出錯(cuò)誤,具體內(nèi)容為org.hibernate.LazyInitializationException: could not initialize proxy - no Session
具體原因在以后進(jìn)行分析) -
多記錄查詢
多記錄查詢用于查詢滿足某一條件的所有結(jié)果,不過(guò)由于所記錄查詢會(huì)涉及到一些HQL的內(nèi)容,所以這里先不介紹,后面會(huì)有一個(gè)小節(jié)專門講解Hibernate的所有的查詢方式以及各自的特點(diǎn)。
修改操作
修改操作同樣有單一的修改操作以及復(fù)雜的修改操作,這里只演示簡(jiǎn)單的修改單一記錄的操作。
在Hibernate中,一個(gè)比較簡(jiǎn)單的修改操作是,將該記錄取出,然后修改該記錄,然后進(jìn)行更新,具體操作如下所示
// 修改操作
@Test
public void testUpdate(){
Session session = HibernateUtils.openSession();
// 獲取id為1的學(xué)生
Students students = session.get(Students.class, 1);
students.setName("jack"); //將名字修改為jack
students.setAge(33); // 將年齡修改為33
Transaction ts = session.beginTransaction();
session.update(students); // 更新該記錄
ts.commit();
session.close();
}
查看數(shù)據(jù)庫(kù)中的數(shù)據(jù)就可以發(fā)現(xiàn),id為1的學(xué)生的姓名以及年齡已經(jīng)更改了。
刪除操作
刪除操作同上,也只演示簡(jiǎn)單的刪除單一記錄的操作。
在Hibernate中,最簡(jiǎn)單的刪除操作是指定一個(gè)對(duì)象的id,并且刪除該對(duì)象即可,如下所示
// 刪除操作
@Test
public void testDelete(){
Session session = HibernateUtils.openSession();
// 刪除id為1的學(xué)生
Students students = new Students();
students.setId(1);
Transaction ts = session.beginTransaction();
session.delete(students); // 刪除該記錄
ts.commit();
session.close();
}
查看數(shù)據(jù)庫(kù)中的數(shù)據(jù)就可以發(fā)現(xiàn),id為1的學(xué)生的記錄已經(jīng)被刪除了。
總結(jié)
本小節(jié)主要對(duì)Hibernate的操作進(jìn)行一個(gè)簡(jiǎn)單的封裝,并且使用Hibernate完成最簡(jiǎn)單的增刪改查操作,Hibernate的學(xué)習(xí)之路還在繼續(xù)。
?
?