Mybatis Mapper XML文件-插入,更新,刪除詳解(insert, update and delete)
Mybatis Mapper XML文件-插入,更新,刪除(insert, update and delete)
數(shù)據(jù)修改語句(插入、更新和刪除)在實(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í)符,可用于引用該語句。 |
| parameterType | 將傳遞到該語句的參數(shù)的完全限定類名或別名。此屬性是可選的,因?yàn)镸yBatis可以根據(jù)傳遞給該語句的實(shí)際參數(shù)計(jì)算要使用的TypeHandler。默認(rèn)值是未設(shè)置的。 |
| parameterMap | 這是一種棄用的引用外部parameterMap的方法。請使用內(nèi)聯(lián)參數(shù)映射和parameterType屬性。 |
| flushCache | 將此設(shè)置為true將在調(diào)用此語句時(shí)刷新第二級(jí)緩存和本地緩存。對于插入、更新和刪除語句,默認(rèn)值為true。 |
| timeout | 這設(shè)置了驅(qū)動(dòng)程序在發(fā)出請求后等待數(shù)據(jù)庫返回的最長時(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ù)庫內(nèi)部生成的鍵(例如,在MySQL或SQL Server等關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的自增字段)。默認(rèn)值為false。 |
| keyProperty | (僅適用于插入和更新)標(biāo)識(shí)一個(gè)屬性,MyBatis將設(shè)置由getGeneratedKeys方法返回的鍵值,或者由insert語句的selectKey子元素返回的鍵值。默認(rèn)值為unset。如果預(yù)期有多個(gè)生成的列,則可以使用逗號(hào)分隔的屬性名稱列表。 |
| keyColumn | (僅適用于插入和更新)設(shè)置表中具有生成鍵的列的名稱。這只在某些數(shù)據(jù)庫(如PostgreSQL)中需要,當(dāng)鍵列不是表中的第一列時(shí)。如果預(yù)期有多個(gè)生成的列,則可以使用逗號(hào)分隔的列名稱列表。 |
| databaseId | 如果配置了databaseIdProvider,則MyBatis將加載所有沒有databaseId屬性或databaseId與當(dāng)前數(shù)據(jù)庫標(biāo)識(shí)匹配的語句。如果在具有和不具有databaseId的情況下找到了相同的語句,則后者將被丟棄。 |
插入、更新和刪除語句的示例
<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>如前所述,插入語句相對更豐富一些,它具有一些額外的屬性和子元素,可以以多種方式處理鍵的生成。
如果你的數(shù)據(jù)庫支持自動(dòng)生成鍵字段(例如MySQL和SQL Server),那么你可以簡單地設(shè)置useGeneratedKeys="true"并將keyProperty設(shè)置為目標(biāo)屬性,就完成了鍵的自動(dòng)生成。
例如,如果上面的Author表使用了自動(dòng)生成列類型作為id,則語句將修改如下:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>如果你的數(shù)據(jù)庫也支持多行插入操作,你可以傳遞一個(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>對于那些不支持自動(dòng)生成列類型或可能還不支持JDBC驅(qū)動(dòng)程序中自動(dòng)生成鍵的數(shù)據(jù)庫,MyBatis提供了另一種處理鍵生成的方式。
下面是一個(gè)簡單(有點(diǎn)傻)的示例,它將生成一個(gè)隨機(jī)的ID(實(shí)際中可能不太會(huì)這樣做,但這展示了MyBatis的靈活性和它對此并不介意):
<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?語句將首先執(zhí)行,Author對象的id屬性將被設(shè)置,然后再調(diào)用 ?insert?語句。這樣可以實(shí)現(xiàn)與數(shù)據(jù)庫自動(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允許使用任何簡單類型作為鍵,包括字符串。如果預(yù)期生成多個(gè)列,則可以使用包含預(yù)期屬性的對象或映射。 |
| order | 此屬性可以設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,則先執(zhí)行 selectKey 語句,將生成的鍵設(shè)置到 keyProperty 上,然后再執(zhí)行插入語句。如果設(shè)置為 AFTER,則先執(zhí)行插入語句,再執(zhí)行 selectKey 語句。這在某些數(shù)據(jù)庫(如 Oracle)中常見,因?yàn)樗鼈兛赡茉诓迦胝Z句中嵌入了序列調(diào)用。 |
| statementType | 同上,MyBatis支持STATEMENT、PREPARED和CALLABLE語句類型,它們分別對應(yīng)于Statement、PreparedStatement和CallableStatement。 |
作為一種特殊情況,一些數(shù)據(jù)庫允許INSERT、UPDATE或DELETE語句返回結(jié)果集(例如PostgreSQL和MariaDB的RETURNING子句,或MS SQL Server的OUTPUT子句)。
這種類型的語句必須被寫成<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 代碼片段,可以包含在其他語句中。它可以在靜態(tài)時(shí)(在加載階段)進(jìn)行參數(shù)化。不同屬性值可以在包含實(shí)例中變化。例如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>然后,這個(gè) SQL 片段可以被包含在另一個(gè)語句中,例如:
<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)文章
關(guān)于stream().sorted()以及java中常用的比較器排序
這篇文章主要介紹了關(guān)于stream().sorted()以及java中常用的比較器排序,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中的BufferedInputStream與BufferedOutputStream使用示例
BufferedInputStream和BufferedOutputStream分別繼承于FilterInputStream和FilterOutputStream,代表著緩沖區(qū)的輸入輸出,這里我們就來看一下Java中的BufferedInputStream與BufferedOutputStream使用示例:2016-06-06
spring mvc中的@ModelAttribute注解示例介紹
在Spring mvc中,注解@ModelAttribute是一個(gè)非常常用的注解,下面這篇文章主要給大家介紹了關(guān)于spring mvc中@ModelAttribute注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09
Java中如何編寫一個(gè)數(shù)的n次方(冪運(yùn)算)?
本文介紹了使用pow函數(shù)和自定義for循環(huán)計(jì)算冪的O(n)時(shí)間復(fù)雜度方法,然后重點(diǎn)講解了快速冪算法的分治思想,以及從二進(jìn)制角度的解釋,包括如何通過位運(yùn)算和循環(huán)迭代實(shí)現(xiàn)高效計(jì)算,給出了Java代碼實(shí)現(xiàn)2024-07-07
Mybatis-Plus中updateById方法不能更新空值問題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Springboot項(xiàng)目通過redis實(shí)現(xiàn)接口的冪等性
這篇文章主要為大家介紹了Springboot項(xiàng)目通過redis實(shí)現(xiàn)接口的冪等性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

