MyBatis 3 XML映射文件-select

2022-04-08 18:03 更新

查詢語(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">
Select 元素的屬性
屬性 描述
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)。
parameterMap 用于引用外部 parameterMap 的屬性,目前已被廢棄。請(qǐng)使用行內(nèi)參數(shù)映射和 parameterType 屬性。
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)分隔。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)