查詢語句是 MyBatis 中最常用的元素之一——光能把數(shù)據(jù)存到數(shù)據(jù)庫中價值并不大,還要能重新取出來才有用,多數(shù)應(yīng)用也都是查詢比修改要頻繁。 MyBatis 的基本原則之一是:在每個插入、更新或刪除操作之間,通常會執(zhí)行多個查詢操作。因此,MyBatis 在查詢和結(jié)果映射做了相當(dāng)多的改進(jìn)。一個簡單查詢的 select 元素是非常簡單的。比如:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
這個語句名為 ?selectPerson
?,接受一個 ?int
?(或 ?Integer
?)類型的參數(shù),并返回一個 ?HashMap
?類型的對象,其中的鍵是列名,值便是結(jié)果行中的對應(yīng)值。
注意參數(shù)符號:
#{id}
這就告訴 MyBatis 創(chuàng)建一個預(yù)處理語句(?PreparedStatement
?)參數(shù),在 ?JDBC
?中,這樣的一個參數(shù)在 SQL 中會由一個“?”來標(biāo)識,并被傳遞到一個新的預(yù)處理語句中,就像這樣:
// 近似的 JDBC 代碼,非 MyBatis 代碼...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
當(dāng)然,使用 ?JDBC
?就意味著使用更多的代碼,以便提取結(jié)果并將它們映射到對象實例中,而這就是 MyBatis 的拿手好戲。參數(shù)和結(jié)果映射的詳細(xì)細(xì)節(jié)會分別在后面單獨的小節(jié)中說明。
?select
?元素允許你配置很多屬性來配置每條語句的行為細(xì)節(jié)。
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
屬性 | 描述 |
---|---|
id
|
在命名空間中唯一的標(biāo)識符,可以被用來引用這條語句。 |
parameterType
|
將會傳入這條語句的參數(shù)的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數(shù),默認(rèn)值為未設(shè)置(unset)。 |
resultType
|
期望從這條語句中返回結(jié)果的類全限定名或別名。 注意,如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。 |
resultMap
|
對外部 resultMap 的命名引用。結(jié)果映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多復(fù)雜的映射問題都能迎刃而解。 resultType 和 resultMap 之間只能同時使用一個。 |
flushCache
|
將其設(shè)置為 true 后,只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存被清空,默認(rèn)值:false。 |
useCache
|
將其設(shè)置為 true 后,將會導(dǎo)致本條語句的結(jié)果被二級緩存緩存起來,默認(rèn)值:對 select 元素為 true。 |
timeout
|
這個設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認(rèn)值為未設(shè)置(unset)(依賴數(shù)據(jù)庫驅(qū)動)。 |
fetchSize
|
這是一個給驅(qū)動的建議值,嘗試讓驅(qū)動程序每次批量返回的結(jié)果行數(shù)等于這個設(shè)置值。 默認(rèn)值為未設(shè)置(unset)(依賴驅(qū)動)。 |
statementType
|
可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。 |
resultSetType
|
FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價于 unset) 中的一個,默認(rèn)值為 unset (依賴數(shù)據(jù)庫驅(qū)動)。 |
databaseId
|
如果配置了數(shù)據(jù)庫廠商標(biāo)識(databaseIdProvider),MyBatis 會加載所有不帶 databaseId 或匹配當(dāng)前 databaseId 的語句;如果帶和不帶的語句都有,則不帶的會被忽略。 |
resultOrdered
|
這個設(shè)置僅針對嵌套結(jié)果 select 語句:如果為 true,將會假設(shè)包含了嵌套結(jié)果集或是分組,當(dāng)返回一個主結(jié)果行時,就不會產(chǎn)生對前面結(jié)果集的引用。 這就使得在獲取嵌套結(jié)果集的時候不至于內(nèi)存不夠用。默認(rèn)值:false 。 |
resultSets
|
這個設(shè)置僅適用于多結(jié)果集的情況。它將列出語句執(zhí)行后返回的結(jié)果集并賦予每個結(jié)果集一個名稱,多個名稱之間以逗號分隔。 |
更多建議: