SqlSession類的各種方法和作用

參考資料:http://www.mybatis.org/mybatis-3/zh/java-api.html#sqlSessions

注意: 當Mybatis與一些依賴注入框架(如Spring或者Guice)同時使用時,SqlSessions將被依賴注入框架所創建,所以你不需要使用SqlSessionFactoryBuilder或者SqlSessionFactory.
mybatis的核心組件包括: SqlSessionFactoryBuilder(構造器),SqlSessionFactory(工廠接口),SqlSession(會話接口),SQLMapper(映射器)。
SqlSessionFactoryBuilder 有五個 build()方法,每一種都允許你從不同的資源中創建一個 SqlSession 實例。

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

一。構造器: SqlSessionFactoryBuilder裏有很多重載的builde方法,mybatis 用的是下面這個。

  public SqlSessionFactory build(Reader reader) {
    return build(reader, null, null);
  }

SqlSessionFactoryBuilder真正重載build方法只有如下三種,分別是InputStream(字節流)、Reader(字符流)、Configuration(類),字節流和字符流都是通過讀取XML配置文件的形式創建SqlSessionFactory,而Configuration採用的是Java代碼方式創建SqlSessionFactory,我們一般常用的是讀取配置文件的形式。

二,創建sqlsession會話器

SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();  
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);  
                return studentMapper.findAllStudents();  

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

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

<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

selectOne 和 selectList 的不同僅僅是 selectOne 必須返回一個對象。 如果多餘一個, 或者 沒有返回 (或返回了 null) 那麼就會拋出異常。 , 如果你不知道需要多少對象, 使用 selectList。
最後,還有查詢方法的三個高級版本,它們允許你限制返回行數的範圍,或者提供自定 義結果控制邏輯,這通常用於大量的數據集合。

<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandler<T> handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)

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

int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);

批量立即更新方法(Flush Method)
有一個方法可以刷新(執行)存儲在JDBC驅動類中的批量更新語句。當你將ExecutorType.BATCH作爲ExecutorType使用時可以採用此方法。

List<BatchResult> flushStatements()

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

void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)

默認情況下 MyBatis 不會自動提交事務, 除非它偵測到有插入, 更新或刪除操作改變了 數據庫。如果你已經做出了一些改變而沒有使用這些方法,那麼你可以傳遞 true 到 commit 和 rollback 方法來保證它會被提交(注意,你不能在自動提交模式下強制 session,或者使用 了外部事務管理器時) 。很多時候你不用調用 rollback(),因爲如果你沒有調用 commit 時 MyBatis 會替你完成。然而,如果你需要更多對多提交和回滾都可能的 session 的細粒度控 制,你可以使用回滾選擇來使它成爲可能。

注意: MyBatis-Spring和MyBatis-Guice提供了聲明事務處理,所以如果你在使用Mybatis的同時使用了Spring或者Guice,那麼請參考它們的手冊以獲取更多的內容。
清理 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();
}

還有,如果你正在使用jdk 1.7以上的版本還有MyBatis 3.2以上的版本,你可以使用try-with-resources語句:

try (SqlSession session = sqlSessionFactory.openSession()) {
    // following 3 lines pseudocode for "doing some work"
    session.insert(...);
    session.update(...);
    session.delete(...);
    session.commit();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章