Mybatis Mapper XML文件-插入,更新,刪除詳解(insert, update and delete)
Mybatis Mapper XML文件-插入,更新,刪除(insert, update and delete)
數(shù)據(jù)修改語句(插入、更新和刪除)在實現(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 | 在該命名空間中的唯一標識符,可用于引用該語句。 |
| parameterType | 將傳遞到該語句的參數(shù)的完全限定類名或別名。此屬性是可選的,因為MyBatis可以根據(jù)傳遞給該語句的實際參數(shù)計算要使用的TypeHandler。默認值是未設置的。 |
| parameterMap | 這是一種棄用的引用外部parameterMap的方法。請使用內(nèi)聯(lián)參數(shù)映射和parameterType屬性。 |
| flushCache | 將此設置為true將在調(diào)用此語句時刷新第二級緩存和本地緩存。對于插入、更新和刪除語句,默認值為true。 |
| timeout | 這設置了驅(qū)動程序在發(fā)出請求后等待數(shù)據(jù)庫返回的最長時間(以秒為單位),超過該時間將拋出異常。默認值是unset(依賴于驅(qū)動程序)。 |
| statementType | 可以選擇其中的一個:STATEMENT、PREPARED或CALLABLE。這會讓MyBatis分別使用Statement、PreparedStatement或CallableStatement。默認值為PREPARED。 |
| useGeneratedKeys | (僅適用于插入和更新)這告訴MyBatis使用JDBC的getGeneratedKeys方法來檢索數(shù)據(jù)庫內(nèi)部生成的鍵(例如,在MySQL或SQL Server等關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的自增字段)。默認值為false。 |
| keyProperty | (僅適用于插入和更新)標識一個屬性,MyBatis將設置由getGeneratedKeys方法返回的鍵值,或者由insert語句的selectKey子元素返回的鍵值。默認值為unset。如果預期有多個生成的列,則可以使用逗號分隔的屬性名稱列表。 |
| keyColumn | (僅適用于插入和更新)設置表中具有生成鍵的列的名稱。這只在某些數(shù)據(jù)庫(如PostgreSQL)中需要,當鍵列不是表中的第一列時。如果預期有多個生成的列,則可以使用逗號分隔的列名稱列表。 |
| databaseId | 如果配置了databaseIdProvider,則MyBatis將加載所有沒有databaseId屬性或databaseId與當前數(shù)據(jù)庫標識匹配的語句。如果在具有和不具有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ù)庫支持自動生成鍵字段(例如MySQL和SQL Server),那么你可以簡單地設置useGeneratedKeys="true"并將keyProperty設置為目標屬性,就完成了鍵的自動生成。
例如,如果上面的Author表使用了自動生成列類型作為id,則語句將修改如下:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>如果你的數(shù)據(jù)庫也支持多行插入操作,你可以傳遞一個作者列表或作者數(shù)組,并獲取自動生成的鍵值。
<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>對于那些不支持自動生成列類型或可能還不支持JDBC驅(qū)動程序中自動生成鍵的數(shù)據(jù)庫,MyBatis提供了另一種處理鍵生成的方式。
下面是一個簡單(有點傻)的示例,它將生成一個隨機的ID(實際中可能不太會這樣做,但這展示了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屬性將被設置,然后再調(diào)用 ?insert?語句。這樣可以實現(xiàn)與數(shù)據(jù)庫自動生成鍵類似的行為,而不會增加Java代碼的復雜性。
`selectKey`元素的描述如下:
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
selectKey 屬性
| Attribute(屬性) | Description(描述) |
|---|---|
| keyProperty | 生成的鍵應該設置在哪個目標屬性上。如果期望有多個生成的列,則可以使用逗號分隔的屬性名稱列表。 |
| keyColumn | 返回結(jié)果集中與屬性匹配的列名。如果期望有多個生成的列,則可以使用逗號分隔的列名列表。 |
| resultType | 結(jié)果的類型。MyBatis通??梢宰詣幼R別,但為了確保準確性,也可以顯式指定類型。MyBatis允許使用任何簡單類型作為鍵,包括字符串。如果預期生成多個列,則可以使用包含預期屬性的對象或映射。 |
| order | 此屬性可以設置為 BEFORE 或 AFTER。如果設置為 BEFORE,則先執(zhí)行 selectKey 語句,將生成的鍵設置到 keyProperty 上,然后再執(zhí)行插入語句。如果設置為 AFTER,則先執(zhí)行插入語句,再執(zhí)行 selectKey 語句。這在某些數(shù)據(jù)庫(如 Oracle)中常見,因為它們可能在插入語句中嵌入了序列調(diào)用。 |
| statementType | 同上,MyBatis支持STATEMENT、PREPARED和CALLABLE語句類型,它們分別對應于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
該元素可用于定義可重復使用的 SQL 代碼片段,可以包含在其他語句中。它可以在靜態(tài)時(在加載階段)進行參數(shù)化。不同屬性值可以在包含實例中變化。例如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>然后,這個 SQL 片段可以被包含在另一個語句中,例如:
<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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于stream().sorted()以及java中常用的比較器排序
這篇文章主要介紹了關(guān)于stream().sorted()以及java中常用的比較器排序,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中的BufferedInputStream與BufferedOutputStream使用示例
BufferedInputStream和BufferedOutputStream分別繼承于FilterInputStream和FilterOutputStream,代表著緩沖區(qū)的輸入輸出,這里我們就來看一下Java中的BufferedInputStream與BufferedOutputStream使用示例:2016-06-06
spring mvc中的@ModelAttribute注解示例介紹
在Spring mvc中,注解@ModelAttribute是一個非常常用的注解,下面這篇文章主要給大家介紹了關(guān)于spring mvc中@ModelAttribute注解的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2017-09-09
Mybatis-Plus中updateById方法不能更新空值問題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
Springboot項目通過redis實現(xiàn)接口的冪等性
這篇文章主要為大家介紹了Springboot項目通過redis實現(xiàn)接口的冪等性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12

