Mybatis Mapper XML文件-插入,更新,刪除詳解(insert, update and delete)
Mybatis Mapper XML文件-插入,更新,刪除(insert, update and delete)
數(shù)據(jù)修改語(yǔ)句(插入、更新和刪除)在實(shí)現(xiàn)上非常相似
<insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20"> <update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20"> <delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">
Insert, Update and Delete 屬性
| Attribute(屬性) | Description(描述) |
|---|---|
| id | 在該命名空間中的唯一標(biāo)識(shí)符,可用于引用該語(yǔ)句。 |
| parameterType | 將傳遞到該語(yǔ)句的參數(shù)的完全限定類名或別名。此屬性是可選的,因?yàn)镸yBatis可以根據(jù)傳遞給該語(yǔ)句的實(shí)際參數(shù)計(jì)算要使用的TypeHandler。默認(rèn)值是未設(shè)置的。 |
| parameterMap | 這是一種棄用的引用外部parameterMap的方法。請(qǐng)使用內(nèi)聯(lián)參數(shù)映射和parameterType屬性。 |
| flushCache | 將此設(shè)置為true將在調(diào)用此語(yǔ)句時(shí)刷新第二級(jí)緩存和本地緩存。對(duì)于插入、更新和刪除語(yǔ)句,默認(rèn)值為true。 |
| timeout | 這設(shè)置了驅(qū)動(dòng)程序在發(fā)出請(qǐng)求后等待數(shù)據(jù)庫(kù)返回的最長(zhǎng)時(shí)間(以秒為單位),超過該時(shí)間將拋出異常。默認(rèn)值是unset(依賴于驅(qū)動(dòng)程序)。 |
| statementType | 可以選擇其中的一個(gè):STATEMENT、PREPARED或CALLABLE。這會(huì)讓MyBatis分別使用Statement、PreparedStatement或CallableStatement。默認(rèn)值為PREPARED。 |
| useGeneratedKeys | (僅適用于插入和更新)這告訴MyBatis使用JDBC的getGeneratedKeys方法來檢索數(shù)據(jù)庫(kù)內(nèi)部生成的鍵(例如,在MySQL或SQL Server等關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中的自增字段)。默認(rèn)值為false。 |
| keyProperty | (僅適用于插入和更新)標(biāo)識(shí)一個(gè)屬性,MyBatis將設(shè)置由getGeneratedKeys方法返回的鍵值,或者由insert語(yǔ)句的selectKey子元素返回的鍵值。默認(rèn)值為unset。如果預(yù)期有多個(gè)生成的列,則可以使用逗號(hào)分隔的屬性名稱列表。 |
| keyColumn | (僅適用于插入和更新)設(shè)置表中具有生成鍵的列的名稱。這只在某些數(shù)據(jù)庫(kù)(如PostgreSQL)中需要,當(dāng)鍵列不是表中的第一列時(shí)。如果預(yù)期有多個(gè)生成的列,則可以使用逗號(hào)分隔的列名稱列表。 |
| databaseId | 如果配置了databaseIdProvider,則MyBatis將加載所有沒有databaseId屬性或databaseId與當(dāng)前數(shù)據(jù)庫(kù)標(biāo)識(shí)匹配的語(yǔ)句。如果在具有和不具有databaseId的情況下找到了相同的語(yǔ)句,則后者將被丟棄。 |
插入、更新和刪除語(yǔ)句的示例
<insert id="insertAuthor">
insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateAuthor">
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
</update>
<delete id="deleteAuthor">
delete from Author where id = #{id}
</delete>如前所述,插入語(yǔ)句相對(duì)更豐富一些,它具有一些額外的屬性和子元素,可以以多種方式處理鍵的生成。
如果你的數(shù)據(jù)庫(kù)支持自動(dòng)生成鍵字段(例如MySQL和SQL Server),那么你可以簡(jiǎn)單地設(shè)置useGeneratedKeys="true"并將keyProperty設(shè)置為目標(biāo)屬性,就完成了鍵的自動(dòng)生成。
例如,如果上面的Author表使用了自動(dòng)生成列類型作為id,則語(yǔ)句將修改如下:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>如果你的數(shù)據(jù)庫(kù)也支持多行插入操作,你可以傳遞一個(gè)作者列表或作者數(shù)組,并獲取自動(dòng)生成的鍵值。
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username, password, email, bio) values
<foreach item="item" collection="list" separator=",">
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach>
</insert>對(duì)于那些不支持自動(dòng)生成列類型或可能還不支持JDBC驅(qū)動(dòng)程序中自動(dòng)生成鍵的數(shù)據(jù)庫(kù),MyBatis提供了另一種處理鍵生成的方式。
下面是一個(gè)簡(jiǎn)單(有點(diǎn)傻)的示例,它將生成一個(gè)隨機(jī)的ID(實(shí)際中可能不太會(huì)這樣做,但這展示了MyBatis的靈活性和它對(duì)此并不介意):
<insert id="insertAuthor">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author
(id, username, password, email,bio, favourite_section)
values
(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>在上面的示例中,?selectKey?語(yǔ)句將首先執(zhí)行,Author對(duì)象的id屬性將被設(shè)置,然后再調(diào)用 ?insert?語(yǔ)句。這樣可以實(shí)現(xiàn)與數(shù)據(jù)庫(kù)自動(dòng)生成鍵類似的行為,而不會(huì)增加Java代碼的復(fù)雜性。
`selectKey`元素的描述如下:
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
selectKey 屬性
| Attribute(屬性) | Description(描述) |
|---|---|
| keyProperty | 生成的鍵應(yīng)該設(shè)置在哪個(gè)目標(biāo)屬性上。如果期望有多個(gè)生成的列,則可以使用逗號(hào)分隔的屬性名稱列表。 |
| keyColumn | 返回結(jié)果集中與屬性匹配的列名。如果期望有多個(gè)生成的列,則可以使用逗號(hào)分隔的列名列表。 |
| resultType | 結(jié)果的類型。MyBatis通常可以自動(dòng)識(shí)別,但為了確保準(zhǔn)確性,也可以顯式指定類型。MyBatis允許使用任何簡(jiǎn)單類型作為鍵,包括字符串。如果預(yù)期生成多個(gè)列,則可以使用包含預(yù)期屬性的對(duì)象或映射。 |
| order | 此屬性可以設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,則先執(zhí)行 selectKey 語(yǔ)句,將生成的鍵設(shè)置到 keyProperty 上,然后再執(zhí)行插入語(yǔ)句。如果設(shè)置為 AFTER,則先執(zhí)行插入語(yǔ)句,再執(zhí)行 selectKey 語(yǔ)句。這在某些數(shù)據(jù)庫(kù)(如 Oracle)中常見,因?yàn)樗鼈兛赡茉诓迦胝Z(yǔ)句中嵌入了序列調(diào)用。 |
| statementType | 同上,MyBatis支持STATEMENT、PREPARED和CALLABLE語(yǔ)句類型,它們分別對(duì)應(yīng)于Statement、PreparedStatement和CallableStatement。 |
作為一種特殊情況,一些數(shù)據(jù)庫(kù)允許INSERT、UPDATE或DELETE語(yǔ)句返回結(jié)果集(例如PostgreSQL和MariaDB的RETURNING子句,或MS SQL Server的OUTPUT子句)。
這種類型的語(yǔ)句必須被寫成<select>來映射返回的數(shù)據(jù)。
<select id="insertAndGetAuthor" resultType="domain.blog.Author"
affectData="true" flushCache="true">
insert into Author (username, password, email, bio)
values (#{username}, #{password}, #{email}, #{bio})
returning id, username, password, email, bio
</select>sql
該元素可用于定義可重復(fù)使用的 SQL 代碼片段,可以包含在其他語(yǔ)句中。它可以在靜態(tài)時(shí)(在加載階段)進(jìn)行參數(shù)化。不同屬性值可以在包含實(shí)例中變化。例如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>然后,這個(gè) SQL 片段可以被包含在另一個(gè)語(yǔ)句中,例如:
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>屬性值也可以在包含的`refid`屬性或包含子句內(nèi)的屬性值中使用,例如:
<sql id="sometable">
${prefix}Table
</sql>
<sql id="someinclude">
from
<include refid="${include_target}"/>
</sql>
<select id="select" resultType="map">
select
field1, field2, field3
<include refid="someinclude">
<property name="prefix" value="Some"/>
<property name="include_target" value="sometable"/>
</include>
</select>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Caused?by:?java.lang.NumberFormatException:?For?input?s
這篇文章主要介紹了Caused?by:?java.lang.NumberFormatException:?For?input?string:?“port“,本文給大家分享完美解決方法,需要的朋友可以參考下2023-01-01
Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例
這篇文章主要介紹了Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12
Springboot整合SpringSecurity實(shí)現(xiàn)登錄認(rèn)證和鑒權(quán)全過程
這篇文章主要介紹了Springboot整合SpringSecurity實(shí)現(xiàn)登錄認(rèn)證和鑒權(quán)全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
springboot實(shí)現(xiàn)圖片大小壓縮功能
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)圖片大小壓縮功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Java開發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)
作為一名java開發(fā)程序員,不知道大家有沒有遇到過一些匪夷所思的bug。這些錯(cuò)誤通常需要您幾個(gè)小時(shí)才能解決。今天,小編總結(jié)一些常見的編碼錯(cuò)誤,然后給出解決方案。希望大家在日常編碼中能夠避免這樣的問題2022-12-12

