Hibernate框架學習之增刪改查
前言
上一小節(jié)我們建立一個基于Maven的Hibernate工程醇份,并且完成基本的配置,粗略地了解了Hibernate,接下來這一小節(jié),我們接著上一小節(jié)的內(nèi)容专挪,利用Hibernate來完成簡單的增上改查。
封裝工具類
為了操作的方面片排,首先先對Hibernate的基本操作進行一個封裝狈蚤,這樣可以提高開發(fā)的效率,減少重復代碼划纽,封裝過程如下所示:
新建一個包,命名為Utils
新建一個類锌畸,命名為HibernateUtils
-
代碼抽取
// 獲取Hibernate的配置對象 Configuration configuration = new Configuration().configure(); // 建立SessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); // 打開session Session session = sessionFactory.openSession(); // 所要添加到數(shù)據(jù)庫的學生對象 Students students = new Students(); students.setAge(22); students.setName("xuhuanfeng"); // 開啟事務(wù) Transaction ts = session.beginTransaction(); // 將數(shù)據(jù)添加到數(shù)據(jù)庫 session.save(students); // 提交事務(wù) ts.commit(); // 關(guān)閉對應(yīng)的連接 session.close(); sessionFactory.close();
上面的代碼是上一小節(jié)中使用到的代碼勇劣,從代碼中可以看到,前面幾行代碼都是重復性潭枣,也就是說比默,每次我們需要獲得一個Session對象的時候,都需要這些代碼盆犁,所以將其抽取出來命咐,形成工具類。
-
代碼封裝
/** * 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對象 public static Session openSession(){ return sessionFactory.openSession(); } }
增加操作
封裝好對應(yīng)的工具類之后谐岁,我們就可以開始增刪改查之旅了醋奠,首先是增加記錄。
增加記錄主要的使用到的方法是save方法伊佃,這個在上一小節(jié)中已經(jīng)了解過了窜司,具體的操作代碼如下所示
// 增加一個記錄
@Test
public void testCreate(){
Session session = HibernateUtils.openSession();
// 所要添加到數(shù)據(jù)庫的學生對象
Students students = new Students();
students.setAge(30);
students.setName("tom");
// 開啟事務(wù)
Transaction ts = session.beginTransaction();
// 將數(shù)據(jù)添加到數(shù)據(jù)庫
session.save(students);
// 提交事務(wù)
ts.commit();
// 關(guān)閉對應(yīng)的連接
session.close();
}
需要注意的是,這里的事務(wù)是需要開啟的航揉,save方法本質(zhì)上并沒有將數(shù)據(jù)保存在數(shù)據(jù)庫中塞祈,只有當事務(wù)commit了之后才會同步到數(shù)據(jù)庫中。
運行之后就可以觀察到帅涂,對應(yīng)的記錄已經(jīng)添加到數(shù)據(jù)庫中了议薪。
查詢操作
接下來是查詢操作,主要分為查詢單一記錄以及查詢滿足條件的所有記錄媳友,查詢操作是一個比較復雜的操作斯议,這里只進行簡單的單表查詢,其他的查詢在后面的小節(jié)中庆锦。
-
單一記錄查詢
單一記錄主要是通過主鍵來獲取對應(yīng)的記錄捅位,也就是通過配置了id的屬性來獲取記錄,使用get方法即可。
// 測試查詢 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 獲取指定id的記錄艇搀,這里的id指的是在元數(shù)據(jù)中配置<id>所對應(yīng)的元素 Students students = session.get(Students.class, 1); System.out.println(students); session.close(); }
Hibernate中同時還提供另外一種獲取單一記錄的方式尿扯,可以使用load方法,兩種方法的操作基本一樣焰雕,如下所示
// 測試查詢 @Test public void testQuery(){ Session session = HibernateUtils.openSession(); // 獲取指定id的記錄衷笋,這里的id指的是在元數(shù)據(jù)中配置<id>所對應(yīng)的元素 Students students = session.load(Students.class,1); System.out.println(students); session.close(); }
這兩種方式的區(qū)別在于,get方法在查詢的時候就直接返回了所查詢記錄的全部內(nèi)容矩屁,而load方法只是返回了具有該主鍵的對象辟宗,只有當使用到該對象的時候,才會去完整地加載該對象吝秕,也就是懶操作/ 延遲操作泊脐。測試該效果的方式非常簡單,只需要將load代碼中的
session.close();
與輸出的代碼交換位置烁峭,就可以看到(此時會拋出錯誤容客,具體內(nèi)容為org.hibernate.LazyInitializationException: could not initialize proxy - no Session
具體原因在以后進行分析) -
多記錄查詢
多記錄查詢用于查詢滿足某一條件的所有結(jié)果,不過由于所記錄查詢會涉及到一些HQL的內(nèi)容约郁,所以這里先不介紹缩挑,后面會有一個小節(jié)專門講解Hibernate的所有的查詢方式以及各自的特點。
修改操作
修改操作同樣有單一的修改操作以及復雜的修改操作鬓梅,這里只演示簡單的修改單一記錄的操作供置。
在Hibernate中,一個比較簡單的修改操作是绽快,將該記錄取出芥丧,然后修改該記錄,然后進行更新谎僻,具體操作如下所示
// 修改操作
@Test
public void testUpdate(){
Session session = HibernateUtils.openSession();
// 獲取id為1的學生
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ù)庫中的數(shù)據(jù)就可以發(fā)現(xiàn)娄柳,id為1的學生的姓名以及年齡已經(jīng)更改了。
刪除操作
刪除操作同上艘绍,也只演示簡單的刪除單一記錄的操作赤拒。
在Hibernate中,最簡單的刪除操作是指定一個對象的id诱鞠,并且刪除該對象即可挎挖,如下所示
// 刪除操作
@Test
public void testDelete(){
Session session = HibernateUtils.openSession();
// 刪除id為1的學生
Students students = new Students();
students.setId(1);
Transaction ts = session.beginTransaction();
session.delete(students); // 刪除該記錄
ts.commit();
session.close();
}
查看數(shù)據(jù)庫中的數(shù)據(jù)就可以發(fā)現(xiàn),id為1的學生的記錄已經(jīng)被刪除了航夺。
總結(jié)
本小節(jié)主要對Hibernate的操作進行一個簡單的封裝蕉朵,并且使用Hibernate完成最簡單的增刪改查操作,Hibernate的學習之路還在繼續(xù)阳掐。
?
?