溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

03.Mybatis SQL 映射的 XML 文件

發(fā)布時(shí)間:2020-07-23 05:09:15 來(lái)源:網(wǎng)絡(luò) 閱讀:1105 作者:IMUKL8 欄目:軟件技術(shù)

MyBatis 真正的力量是在映射語(yǔ)句中,SQL 映射文件有以下幾個(gè)頂級(jí)元素.

  • cache - 配置給定命名空間的緩存
  • cache-ref – 從其他命名空間引用緩存配置
  • resultMap – 用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載你的對(duì)象
  • sql – 可以重用的 SQL 塊,也可以被其他語(yǔ)句引用
  • insert – 映射插入語(yǔ)句
  • update – 映射更新語(yǔ)句
  • delete – 映射刪除語(yǔ)句
  • select – 映射查詢語(yǔ)句

<br/>

select

查詢語(yǔ)句是使用 MyBatis 時(shí)最常用的元素之一,對(duì)于每次插入,更新或刪除,那也會(huì)有很多的查詢。這是 MyBatis 的一個(gè)基本原則,也是將重心和努力放到查詢和結(jié)果映射的原因。對(duì)簡(jiǎn)單類別的查詢?cè)厥欠浅:?jiǎn)單的。

比如:

<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
SELECT * FROM PERSON WHERE ID = #{id}
</select>

這個(gè)語(yǔ)句被稱作 selectPerson,使用一個(gè) int(或 Integer)類型的參數(shù),并返回一個(gè) HashMap類型的對(duì)象,其中的鍵是列名,值是列對(duì)應(yīng)的值。
<br/>
這就告訴 MyBatis 創(chuàng)建一個(gè) PreparedStatement(預(yù)處理語(yǔ)句)參數(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)然,這需要很多單獨(dú)的 JDBC 的代碼來(lái)提取結(jié)果并將它們映射到對(duì)象實(shí)例中,這就是MyBatis 節(jié)省你時(shí)間的地方。我們需要深入了解參數(shù)和結(jié)果映射.

select 元素有很多屬性允許你配置,來(lái)決定每條語(yǔ)句的作用細(xì)節(jié)。

<select
id=”selectPerson”
parameterType=”int”
resultType=”hashmap”
resultMap=”personResultMap”
flushCache=”false”
useCache=”true”
timeout=”10000”
fetchSize=”256”
statementType=”PREPARED”
resultSetType=”FORWARD_ONLY”
>

如下內(nèi)容為各個(gè)參數(shù)的介紹:

  • id [在命名空間中唯一的標(biāo)識(shí)符,可以被用來(lái)引用SQL語(yǔ)句]
  • parameterType [傳入SQL語(yǔ)句的參數(shù)類的類型]
  • resultTyp [SQL語(yǔ)句中返回的期望類型的類的類型或者別名。對(duì)于集合來(lái)說(shuō),那應(yīng)該是集合可以包含的類型,而不能是集合本身]
  • resultMap [命名引用外部的 resultMap]
   <!--設(shè)置domain類和數(shù)據(jù)庫(kù)中表的字段一一對(duì)應(yīng),注意數(shù)據(jù)庫(kù)字段和domain類中的字段名稱不致,此處一定要!-->
    <resultMap id="BaseResultMap" type="User">
        <id column="USER_ID" property="userId" jdbcType="INTEGER" />
        <result column="USER_NAME" property="userName" jdbcType="CHAR" />
        <result column="USER_PASSWORD" property="userPassword" jdbcType="CHAR" />
        <result column="USER_EMAIL" property="userEmail" jdbcType="CHAR" />
    </resultMap>
    <!-- 查詢單條記錄 -->
    <select id="selectUserById" parameterType="int" resultMap="BaseResultMap">
        SELECT * FROM t_user WHERE USER_ID = #{userId}
    </select>
  • flushCache [將其設(shè)置為 true,無(wú)論語(yǔ)句什么時(shí)候被調(diào)用,都會(huì)導(dǎo)致緩存被清
    空。默認(rèn)值:false]
  • useCache [將其設(shè)置為 true,將會(huì)導(dǎo)致本條語(yǔ)句的結(jié)果被緩存。默認(rèn)值:true]
  • timeout [驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果,并拋出異常時(shí)間的
    最大等待值]
  • fetchSize [驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)]
  • statementType [STATEMENT,PREPARED 或 CALLABLE 的一種,這會(huì)讓 MyBatis使用選擇使用 Statement,PreparedStatement 或 CallableStatement,
    默認(rèn)值:PREPARED]
  • resultSetType [FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE
    中的一種。默認(rèn)是不設(shè)置(驅(qū)動(dòng)自行處理)]

insert

<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
useGeneratedKeys=""
timeout="20000">

對(duì)于插入操作,假如數(shù)據(jù)庫(kù)表結(jié)構(gòu)中支持自動(dòng)生成主鍵的字段,那么你可以設(shè)置 useGeneratedKeys=”true”,而且設(shè)置 keyProperty 到你已經(jīng)做好的目標(biāo)屬性上.

例如:

<insert id="insertAuthor" parameterType="domain.blog.Author"
useGeneratedKeys=”true” keyProperty=”id”>
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>

update

<update
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">

例如:

<update id="updateAuthor" parameterType="domain.blog.Author">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>

delete

<delete
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000">

例如:

<delete id="deleteAuthor” parameterType="int">
delete from Author where id = #{id}
</delete>
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI