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)識符,可用于引用該語句。 |
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í)刷新第二級緩存和本地緩存。對于插入、更新和刪除語句,默認(rèn)值為true。 |
timeout | 這設(shè)置了驅(qū)動程序在發(fā)出請求后等待數(shù)據(jù)庫返回的最長時(shí)間(以秒為單位),超過該時(shí)間將拋出異常。默認(rèn)值是unset(依賴于驅(qū)動程序)。 |
statementType | 可以選擇其中的一個(gè):STATEMENT、PREPARED或CALLABLE。這會讓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)識一個(gè)屬性,MyBatis將設(shè)置由getGeneratedKeys方法返回的鍵值,或者由insert語句的selectKey子元素返回的鍵值。默認(rèn)值為unset。如果預(yù)期有多個(gè)生成的列,則可以使用逗號分隔的屬性名稱列表。 |
keyColumn | (僅適用于插入和更新)設(shè)置表中具有生成鍵的列的名稱。這只在某些數(shù)據(jù)庫(如PostgreSQL)中需要,當(dāng)鍵列不是表中的第一列時(shí)。如果預(yù)期有多個(gè)生成的列,則可以使用逗號分隔的列名稱列表。 |
databaseId | 如果配置了databaseIdProvider,則MyBatis將加載所有沒有databaseId屬性或databaseId與當(dāng)前數(shù)據(jù)庫標(biāo)識匹配的語句。如果在具有和不具有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),那么你可以簡單地設(shè)置useGeneratedKeys="true"并將keyProperty設(shè)置為目標(biāo)屬性,就完成了鍵的自動生成。
例如,如果上面的Author表使用了自動生成列類型作為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ù)組,并獲取自動生成的鍵值。
<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提供了另一種處理鍵生成的方式。
下面是一個(gè)簡單(有點(diǎn)傻)的示例,它將生成一個(gè)隨機(jī)的ID(實(shí)際中可能不太會這樣做,但這展示了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ù)庫自動生成鍵類似的行為,而不會增加Java代碼的復(fù)雜性。
`selectKey`元素的描述如下:
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
selectKey 屬性
Attribute(屬性) | Description(描述) |
---|---|
keyProperty | 生成的鍵應(yīng)該設(shè)置在哪個(gè)目標(biāo)屬性上。如果期望有多個(gè)生成的列,則可以使用逗號分隔的屬性名稱列表。 |
keyColumn | 返回結(jié)果集中與屬性匹配的列名。如果期望有多個(gè)生成的列,則可以使用逗號分隔的列名列表。 |
resultType | 結(jié)果的類型。MyBatis通??梢宰詣幼R別,但為了確保準(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)文章
Caused?by:?java.lang.NumberFormatException:?For?input?s
這篇文章主要介紹了Caused?by:?java.lang.NumberFormatException:?For?input?string:?“port“,本文給大家分享完美解決方法,需要的朋友可以參考下2023-01-01Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例
這篇文章主要介紹了Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12Springboot整合SpringSecurity實(shí)現(xiàn)登錄認(rèn)證和鑒權(quán)全過程
這篇文章主要介紹了Springboot整合SpringSecurity實(shí)現(xiàn)登錄認(rèn)證和鑒權(quán)全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12springboot實(shí)現(xiàn)圖片大小壓縮功能
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)圖片大小壓縮功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Java開發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)
作為一名java開發(fā)程序員,不知道大家有沒有遇到過一些匪夷所思的bug。這些錯(cuò)誤通常需要您幾個(gè)小時(shí)才能解決。今天,小編總結(jié)一些常見的編碼錯(cuò)誤,然后給出解決方案。希望大家在日常編碼中能夠避免這樣的問題2022-12-12