SqlSession類的方法說明


   

    SqlSession實例在MyBatis中是非常強大的一個類。在這里你會發現所有執行語句的方法,提交或回滾事務,還有獲取映射器實例。在SqlSession類中有超過20個方法,所以將它們分開成易於理解的組合。 

 

語句執行方法 

    這些方法被用來執行定義在SQL映射的XML文件中的SELECT,INSERT,UPDATE和DELETE語句。它們都會自行解釋,每一句都使用語句的ID屬性和參數對象,參數可以是原生類型(自動裝箱或包裝類),JavaBean,POJO或Map。 

 

      Object selectOne(String statement, Object parameter) 

      List selectList(String statement, Object parameter) 

      int insert(String statement, Object parameter) 

      int update(String statement, Object parameter) 

      int delete(String statement, Object parameter) 

 

    selectOne和selectList的不同僅僅是selectOne必須返回一個對象。如果多余一個,或者沒有返回(或返回了null),那么就會拋出異常。如果你不知道需要多少對象,使用selectList。如果你想檢查一個對象是否存在,那么最好返回統計數(0或1)。

因為並不是所有語句都需要參數,這些方法都是有不同重載版本的,它們可以不需要參數對象。 

 

      Object selectOne(String statement) 

      List selectList(String statement) 

      int insert(String statement) 

      int update(String statement) 

      int delete(String statement) 

 

最后,還有查詢方法的三個高級版本,它們允許你限制返回行數的范圍,或者提供自定義結果控制邏輯,這通常用於大量的數據集合。 

 

      List selectList (String statement, Object parameter, RowBounds rowBounds) 

      void select (String statement, Object parameter, ResultHandler handler) 

      void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) 

 

RowBounds參數會告訴MyBatis略過指定數量的記錄,還有限制返回結果的數量。RowBounds類有一個構造方法來接收offset和limit,否則是不可改變的。 

 

      int offset = 100; 

      int limit = 25; 

      RowBounds rowBounds = new RowBounds(offset, limit); 

 

不同的驅動會實現這方面的不同級別的效率。對於最佳的表現,使用結果集類型的SCROLL_SENSITIVE或SCROLL_INSENSITIVE(或句話說:不是FORWARD_ONLY)。 

ResultHandler參數允許你按你喜歡的方式處理每一行。你可以將它添加到List中,創建Map,Set或拋出每個結果而不是只保留總計。你可以使用ResultHandler做很多漂亮的事,那就是MyBatis內部創建結果集列表。 

它的接口很簡單。 

 

      package org.mybatis.executor.result; 

      public interface ResultHandler { 

          void handleResult(ResultContext context); 

      } 

 

ResultContext參數給你訪問結果對象本身的方法,大量結果對象被創建,你可以使用布爾返回值的stop()方法來停止MyBatis加載更多的結果。 

 

 

事務控制方法 

控制事務范圍有四個方法。當然,如果你已經選擇了自動提交或你正在使用外部事務管理器,這就沒有任何效果了。然而,如果你正在使用JDBC事務管理員,由Connection實例來控制,那么這四個方法就會派上用場: 

 

      void commit() 

      void commit(boolean force) 

      void rollback() 

      void rollback(boolean force) 

 

    默認情況下MyBatis不會自動提交事務,除非它偵測到有插入,更新或刪除操作改變了數據庫。如果你已經做出了一些改變而沒有使用這些方法,那么你可以傳遞true到commit和rollback方法來保證它會被提交

(注意,你不能在自動提交模式下強制session,或者使用了外部事務管理器時)。很多時候你不用調用rollback(),因為如果你沒有調用commit時MyBatis會替你完成。然而,如果你需要更多對多提交和回滾都可能

的session的細粒度控制,你可以使用回滾選擇來使它成為可能。 

 

 

清理Session級的緩存 

 

      void clearCache() 

 

SqlSession實例有一個本地緩存在執行update,commit,rollback和close時被清理。要明確地關閉它(獲取打算做更多的工作),你可以調用clearCache()。 

 

 

確保SqlSession被關閉 

 

     void close() 

 

你必須保證的最重要的事情是你要關閉所打開的任何session。保證做到這點的最佳方式是下面的工作模式: 

 

     SqlSession session = sqlSessionFactory.openSession(); 

      try { 

           // following 3 lines pseudocod for “doing some work” 

            session.insert(…); 

            session.update(…); 

            session.delete(…); 

            session.commit(); 

      } finally { 

           session.close(); 

      } 

 

注意:就像SqlSessionFactory,你可以通過調用getConfiguration()方法獲得SqlSession使用的Configuration實例 

      Configuration getConfiguration() 

 

 

使用映射器 

     <T> T getMapper(Class<T> type) 

    上述的各個insert,update,delete和select方法都很強大,但也有些繁瑣,沒有類型安全,對於你的IDE也沒有幫助,還有可能的單元測試。在上面的入門章節中我們已經看到了一個使用映射器的示例。 

因此,一個更通用的方式來執行映射語句是使用映射器類。一個映射器類就是一個簡單的接口,其中的方法定義匹配於SqlSession方法。下面的示例展示了一些方法簽名和它們是如何映射到SqlSession的。 

 

      public interface AuthorMapper { 

            // (Author) selectOne(“selectAuthor”,5); 

            Author selectAuthor(int id); 

            // (List<Author>) selectList(“selectAuthors”) 

            List<Author> selectAuthors(); 

            // insert(“insertAuthor”, author) 

            void insertAuthor(Author author); 

            // updateAuthor(“updateAuhor”, author) 

            void updateAuthor(Author author); 

            // delete(“deleteAuthor”,5) 

            void deleteAuthor(int id); 

        } 

 

    總之,每個映射器方法簽名應該匹配相關聯的SqlSession方法,而沒有字符串參數ID。相反,方法名必須匹配映射語句的ID。 此外,返回類型必須匹配期望的結果類型。所有常用的類型都是支持的,包括:原生類型,Map,POJO和JavaBean。 

 

1、映射器接口不需要去實現任何接口或擴展任何類。只要方法前面可以被用來唯一標識對應的映射語句就可以了。

2、映射器接口可以擴展其他接口。當使用XML來構建映射器接口時要保證在合適的命名空間中有語句。而且,唯一的限制就是你不能在兩個繼承關系的接口中有相同的方法簽名(這也是不好的想法)。 

 

    你可以傳遞多個參數給一個映射器方法。如果你這樣做了,默認情況下它們將會以它們在參數列表中的位置來命名,比如:#{1},#{2}等。如果你想改變參數的名稱(只在多參數情況下),那么你可以在參數上使用@Param(“paramName”)注解。 

你也可以給方法傳遞一個RowBounds實例來限制查詢結果。 

 

 

映射器注解 

    因為最初設計時,MyBatis是一個XML驅動的框架。配置信息是基於XML的,而且映射語句也是定義在XML中的。而到了MyBatis 3,有新的可用的選擇了。MyBatis 3構建在基於全面而且強大的Java配置API之上。

這個配置API是基於XML的MyBatis配置的基礎,也是新的基於注解配置的基礎。注解提供了一種簡單的方式來實現簡單映射語句,而不會引入大量的開銷。 

注意:不幸的是,Java注解限制了它們的表現和靈活。盡管很多時間都花調查,設計和實驗上,最強大的MyBatis映射不能用注解來構建,那並不可笑。C#屬性(做示例)就沒有這些限制,因此MyBatis.NET將會比XML有更豐富的選擇。

也就是說,基於Java注解的配置離不開它的特性。 

注解有下面這些: 注解 

目標 

相對應的XML 

描述 

@CacheNamespace 

類 

<cache> 

為給定的命名空間(比如類)配置緩存。屬性:implemetation,eviction, 

flushInterval,size和readWrite。 

@CacheNamespaceRef 

類 

<cacheRef> 

參照另外一個命名空間的緩存來使用。屬性:value,應該是一個名空姐的字符串值(也就是類的完全限定名)。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM