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,應該是一個名空姐的字符串值(也就是類的完全限定名)。 |