MyBatis教程大全


 MyBatis SQL 映射

     MyBatis select 标签

     MyBatis 多数据库支持

     MyBatis selectKey 标签作用

     MyBatis @SelectKey注解用法介绍

     MyBatis @SelectKey注解用法详细介绍

     MyBatis keyProperty 属性介绍

     MyBatis insert、update 和 delete 元素

     MyBatis sql 元素

 MyBatis SQL 参数映射

     MyBatis SQL 参数映射

 MyBatis 动态SQL

     MyBatis 动态SQL与数据准备

     MyBatis if 标签

     MyBatis if else 用法

     MyBatis choose、when、otherwise 标签

     MyBatis where 标签

     MyBatis set 标签

     MyBatis foreach 标签

     MyBatis bind 标签

     MyBatis trim 标签

 MyBatis SQL 结果映射

 MyBatis SQL 结果之关系映射

 MyBatis 使用介绍

     MyBatis typeAliases 类型别名

     MyBatis typeHandlers 类型处理器

     MyBatis Transaction 事务接口

     MyBatis transactionManager 事务管理

     SqlSessionFactory 介绍

     MyBatis 核心对象 SqlSession

     MyBatis 初始化 创建 Session 实例

     MyBatis ObjectFactory 对象工厂

     MyBatis缓存机制:一级缓存和二级缓存

     MyBatis 常用注解

 MyBatis 配置文件

     MyBatis 配置文件

 MyBatis 映射

     MyBatis 映射简介

     MyBatis ResultMap 映射

     MyBatis 自动映射

     MyBatis 高级映射

     MyBatis 集合映射

     MyBatis 关联映射

     MyBatis 一对一关联映射

     MyBatis 一对多关联映射

     MyBatis 多对多关联映射

     MyBatis 一对一(注解形式)

     MyBatis 一对多(注解形式)

     MyBatis 多对多(注解形式)

     MyBatis resultMap 元素

 MyBatis 面试题库

     #{}和${}的区别是什么?

     数据库链接中断如何处理?

     数据库插入重复如何处理?

     事务执行过程中宕机的应对处理方式

     Java客户端中的一个Connection问题

MyBatis insert、update 和delete元素

备注:本文修订于2022年6月22日

MyBatis insert、update 和delete元素

insert,update和delete元素用来映射DML语句,是MyBatis 中最常用的元素之一。insert、update和delete元素配置和select 非常接近。例如:

<insert
id="insertUser"
parameterType="cn.mybatis.domain.ser"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
<update
id= "updateUser"
parameterType="cn.mybatis.domain.User"
flushtCache="true"
statementType="PREPARED"
timeout="20">
<delete
id="deleteUser"
parameterType="cn.mybatis.domain.User"
flushcache="true"
statementType="PRBPARED"
timeout="20">

MyBatis insert、update 和delete元素的特有属性

insert,update 和delete元素的属性大多和select一致,它们特有的属性描述如下:

useGeneratedKeys(仅对insert和update有用) :这会令MyBatis使用JDBC的getGeneratedKeys方法来获取由数据库内部生成的主键(比如,像MySQL和SQL Server这样的关系数据库管理系统的自动递增字段),默认值为false

keyProperty(仅对insert和update有用):唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的selectKey子元素设置它的键值,默认为unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

keyColumn(仅对insert和update有用) :通过生成的键值设置表中的列名,这个设置仅对某些数据库(像PostgreSQL) 是必须的,当主键列不是表中的第一列时需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

MyBatis insert、update 和delete元素的举例介绍

<insert id="insertUser">
insert into TB_USER (id,username,password,email,address)
values (#{id},#{username},#{password},#{emai},#{address})
</insert>
<update id="updateUser" >
update TB_USER set
username = #{username},
password = #{password},
email = #{email},
address = #{address}
where id = #{id}
</update>
<delete id="deleteUser"
delete from TB_USER where id = #{id}
</delete>

而插入语句的配置规则更加丰富,因为在插入语句执行时很多时候是需要返回插入成功的数据生成的主键值的,所以<insert.../>元素里面有一些额外的属性和子元素用来处理主键的生成,而且根据数据库的主键生成策略不同,配置也有多种方式。

首先,如果数据库支持自动生成主键的字段(比如MySQL和SQLServer),那么可以设置useGeneratedKeys="true”,然后再把keyProperty设置到目标属性上就可以了(一般会设置到id属性上)。例如,如果上面的TB_USER 表已经对id 使用了自动生成的列类型,那么语句可以修改为:

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into TB_USER (username,password,email,address)
values (#{username},#{password},#{email},#{address})
</insert>

对于不支持自动生成类型的数据库(比如Oracle) 或可能不支持自动生成主键的JDBC驱动来说,MyBatis有另外一种方法来生成主键。

<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select SEQUENCE TB_USER.nextval as id from dual
</selectKey>
insert into TB_USER
(id,username,password,email,address)
values
(#{id},#{username},#{password},#{email},#{address})
</insert>

在上面的示例中,selectKey元素将会首先运行,其通过查询SEQUENCB序列,从而TB_USER的id会被设置,然后插入语句会被调用。

selectKey 元素介绍

<selectKey
keyProperty= "id"
resultType="int"
order="BBFORE"
statementType="PREPARED">

keyProperty:selectKey 语句结果应该被设置的目标属性(一般会设置到id属性上)。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

keyColumn:匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

resultType:结果的类型。MyBatis 通常可以推算出来,但是为了更加确定,建议明确写出。MyBatis允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的Object或一个Map。

order:可以被设置为BEFORE 或AFTER。如果设置为BEFORE,那么它会首先选择主键,设置keyProperty然后执行插入语句。如果设置为AFTER,那么先执行插入语句,然后是selectKey元素。

statementType:与前面相同,MyBatis支持STATEMENT、PREPARED 和CALLABLE语句的映射类型,分别代表Statement,PreparedStatement 和CallableStatement 类型。