Hibernate框架學(xué)習(xí)之增刪改查

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ò)程如下所示:

  1. 新建一個(gè)包,命名為Utils

  2. 新建一個(gè)類,命名為HibernateUtils

  3. 代碼抽取

       // 獲取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),形成工具類。

  4. 代碼封裝

    /**
     * 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ù)。

?

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容