MyBatis插入相关问题(insert、InsertSelec
2018-01-31 本文已影响4000人
OnyWang
自动生成代码insert和insertSelective的区别
自动生成的mybatis对应配置文件里面,有两个方法,分别为insert和insertSelective。这两个方法均是插入对象的方法。这里说一下两者的区别。
首先看一下两者代码:
- insert
<insert id="insert" parameterType="com.cx.elearnning.model.SysSubject" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
insert into sys_subject (SUBJECT_ID, SUBJECT_NAME, STATUS,
CREATE_TIME, PARENT_ID, sort
)
values (#{subjectId,jdbcType=INTEGER}, #{subjectName,jdbcType=VARCHAR}, #{status,jdbcType=BIT},
#{createTime,jdbcType=TIMESTAMP}, #{parentId,jdbcType=INTEGER}, #{sort,jdbcType=INTEGER}
)
</insert>
- insertSelective
<insert id="insertSelective" parameterType="com.cx.elearnning.model.SysSubject" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
insert into sys_subject
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="subjectId != null" >
SUBJECT_ID,
</if>
<if test="subjectName != null" >
SUBJECT_NAME,
</if>
<if test="status != null" >
STATUS,
</if>
<if test="createTime != null" >
CREATE_TIME,
</if>
<if test="parentId != null" >
PARENT_ID,
</if>
<if test="sort != null" >
sort,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="subjectId != null" >
#{subjectId,jdbcType=INTEGER},
</if>
<if test="subjectName != null" >
#{subjectName,jdbcType=VARCHAR},
</if>
<if test="status != null" >
#{status,jdbcType=BIT},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="parentId != null" >
#{parentId,jdbcType=INTEGER},
</if>
<if test="sort != null" >
#{sort,jdbcType=INTEGER},
</if>
</trim>
</insert>
分析
看完代码大体上就能区分两者的区别了吧?
insertSelective对应的sql语句加入了NULL校验,即只会插入数据不为null的字段值。
insert则会插入所有字段,会插入null。
如何在执行插入数据之后返回新增数据的ID(自增)
这里我们需要使用几个属性,分别为:useGeneratedKeys、keyColumn、keyProperty。
上面所说的两个插入方法,均不会返回新增数据的ID。原因就是没有配置这三个属性。
配置方式
首先,需要配置useGeneratedKeys属性,设置为true。说明将自动生成的主键值进行了获取。
之后,设置keyColumn(对应数据表字段)、keyProperty(对应对象属性)。即将自动生成的主键值赋值给那个属性!
示例如下:
<insert id="createSubject" parameterType="com.cx.elearnning.model.SysSubject" useGeneratedKeys="true" keyColumn="SUBJECT_ID" keyProperty="subjectId">
INSERT INTO SYS_SUBJECT (
<include refid="sys_subject_columns" />
)
VALUES (
<include refid="sys_subject_properties" />
)
</insert>
表示将自增值赋值给了sunjectId属性