數(shù)據(jù)變更語句 insert,update 和 delete 的實現(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">
屬性 | 描述 |
---|---|
id
|
在命名空間中唯一的標識符,可以被用來引用這條語句。 |
parameterType
|
將會傳入這條語句的參數(shù)的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數(shù),默認值為未設(shè)置(unset)。 |
parameterMap |
|
flushCache
|
將其設(shè)置為 true 后,只要語句被調(diào)用,都會導致本地緩存和二級緩存被清空,默認值:(對 insert、update 和 delete 語句)true。 |
timeout
|
這個設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認值為未設(shè)置(unset)(依賴數(shù)據(jù)庫驅(qū)動)。 |
statementType
|
可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。 |
useGeneratedKeys
|
(僅適用于 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段),默認值:false。 |
keyProperty
|
(僅適用于 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設(shè)置它的值,默認值:未設(shè)置(unset )。如果生成列不止一個,可以用逗號分隔多個屬性名稱。 |
keyColumn
|
(僅適用于 insert 和 update)設(shè)置生成鍵值在表中的列名,在某些數(shù)據(jù)庫(像 PostgreSQL)中,當主鍵列不是表中的第一列的時候,是必須設(shè)置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。 |
databaseId
|
如果配置了數(shù)據(jù)庫廠商標識(databaseIdProvider),MyBatis 會加載所有不帶 databaseId 或匹配當前 databaseId 的語句;如果帶和不帶的語句都有,則不帶的會被忽略。 |
下面是 insert,update 和 delete 語句的示例:
<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>
如前所述,插入語句的配置規(guī)則更加豐富,在插入語句里面有一些額外的屬性和子元素用來處理主鍵的生成,并且提供了多種生成方式。
首先,如果你的數(shù)據(jù)庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server),那么你可以設(shè)置 ?useGeneratedKeys=”true”
?,然后再把 ?keyProperty
設(shè)置為目標屬性就 OK 了。例如,如果上面的 Author 表已經(jīng)在 id 列上使用了自動生成,那么語句可以修改為:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
如果你的數(shù)據(jù)庫還支持多行插入, 你也可以傳入一個 Author 數(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>
對于不支持自動生成主鍵列的數(shù)據(jù)庫和可能不支持自動生成主鍵的 JDBC 驅(qū)動,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 元素中的語句,并設(shè)置 Author 的 id,然后才會調(diào)用插入語句。這樣就實現(xiàn)了數(shù)據(jù)庫自動生成主鍵類似的行為,同時保持了 Java 代碼的簡潔。
selectKey 元素描述如下:
<selectKey
keyProperty="id"
resultType="int"
order="BEFORE"
statementType="PREPARED">
屬性 | 描述 |
---|---|
keyProperty
|
selectKey 語句結(jié)果應(yīng)該被設(shè)置到的目標屬性。如果生成列不止一個,可以用逗號分隔多個屬性名稱。 |
keyColumn
|
返回結(jié)果集中生成列屬性的列名。如果生成列不止一個,可以用逗號分隔多個屬性名稱。 |
resultType
|
結(jié)果的類型。通常 MyBatis 可以推斷出來,但是為了更加準確,寫上也不會有什么問題。MyBatis 允許將任何簡單類型用作主鍵的類型,包括字符串。如果生成列不止一個,則可以使用包含期望屬性的 Object 或 Map。 |
order
|
可以設(shè)置為 BEFORE 或 AFTER 。如果設(shè)置為 BEFORE ,那么它首先會生成主鍵,設(shè)置 keyProperty 再執(zhí)行插入語句。如果設(shè)置為 AFTER ,那么先執(zhí)行插入語句,然后是 selectKey 中的語句 - 這和 Oracle 數(shù)據(jù)庫的行為相似,在插入語句內(nèi)部可能有嵌入索引調(diào)用。 |
statementType
|
和前面一樣,MyBatis 支持 STATEMENT ,PREPARED 和 CALLABLE 類型的映射語句,分別代表 Statement , PreparedStatement 和 CallableStatement 類型。 |
這個元素可以用來定義可重用的 SQL 代碼片段,以便在其它語句中使用。 參數(shù)可以靜態(tài)地(在加載的時候)確定下來,并且可以在不同的 include 元素中定義不同的參數(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>
也可以在 include 元素的 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>
更多建議: