MyBatis插入相关问题(insert、InsertSelective)

自动生成代码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属性

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,326评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,876评论 18 399
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 6,125评论 0 4
  • #01 “我们分手吧。”陆川眼睛通红的对着卢嘉欣说道。 “终于走到今天了吗。”卢嘉欣内心自嘲了一声,然后抬起了头目...
    笙和箫阅读 1,080评论 15 14
  • 前言 最近更新AndroidStudio 至Canary 8 版本了,看样子AS3.0和android O的发布很...
    amosbake阅读 2,113评论 1 2

友情链接更多精彩内容