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