MyBatis插入Insert、InsertSelective的区别及使用心得

 更新时间:2021年12月03日 09:01:46   作者:啊~~噙!  
这篇文章主要介绍了MyBatis插入Insert、InsertSelective的区别及使用心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MyBatis插入Insert、InsertSelective的区别

逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分别为insert和insertSelective。这两个方法均是插入对象的方法。为什么会有两个插入方法呢?

这里说一下两者的区别

首先我们看代码如下:

insert方法

<insert id="insert" parameterType="demo.pojo.domain.HspMediaInf" >
    insert into MEDIA_INF (MED_SEQ, EMG_SEQ, MED_CLASS, 
      MED_NAME, MED_FILE, MED_EXTEND, 
      MED_TYPE, MED_DATE, MED_SIZE, 
      MED_DATA)
    values (#{medSeq,jdbcType=VARCHAR}, #{emgSeq,jdbcType=VARCHAR}, #{medClass,jdbcType=VARCHAR}, 
      #{medName,jdbcType=VARCHAR}, #{medFile,jdbcType=VARCHAR}, #{medExtend,jdbcType=VARCHAR}, 
      #{medType,jdbcType=VARCHAR}, #{medDate,jdbcType=TIMESTAMP}, #{medSize,jdbcType=DECIMAL}, 
      #{medData,jdbcType=BLOB})
  </insert>

insertSelective方法

<insert id="insertSelective" parameterType="activetech.zyyhospital.pojo.domain.HspMediaInf" >
    insert into HSP_MEDIA_INF
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="medSeq != null" >
        MED_SEQ,
      </if>
      <if test="emgSeq != null" >
        EMG_SEQ,
      </if>
      <if test="medClass != null" >
        MED_CLASS,
      </if>
      <if test="medName != null" >
        MED_NAME,
      </if>
      <if test="medFile != null" >
        MED_FILE,
      </if>
      <if test="medExtend != null" >
        MED_EXTEND,
      </if>
      <if test="medType != null" >
        MED_TYPE,
      </if>
      <if test="medDate != null" >
        MED_DATE,
      </if>
      <if test="medSize != null" >
        MED_SIZE,
      </if>
      <if test="medData != null" >
        MED_DATA,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="medSeq != null" >
        #{medSeq,jdbcType=VARCHAR},
      </if>
      <if test="emgSeq != null" >
        #{emgSeq,jdbcType=VARCHAR},
      </if>
      <if test="medClass != null" >
        #{medClass,jdbcType=VARCHAR},
      </if>
      <if test="medName != null" >
        #{medName,jdbcType=VARCHAR},
      </if>
      <if test="medFile != null" >
        #{medFile,jdbcType=VARCHAR},
      </if>
      <if test="medExtend != null" >
        #{medExtend,jdbcType=VARCHAR},
      </if>
      <if test="medType != null" >
        #{medType,jdbcType=VARCHAR},
      </if>
      <if test="medDate != null" >
        #{medDate,jdbcType=TIMESTAMP},
      </if>
      <if test="medSize != null" >
        #{medSize,jdbcType=DECIMAL},
      </if>
      <if test="medData != null" >
        #{medData,jdbcType=BLOB},
      </if>
    </trim>
  </insert>

从上面连段代码我们会发现insertSelective对应的sql语句加入了NULL校验,只会插入数据不为null的字段值。insert则会插入所有字段,会插入null。

笔者反思但是为什么会有这两种方法呢

总结:由于真实开发中,我们在修改功能的from表单,或者一个类的某些模块编辑的from表单中不会将所有的数据都查询出来放到from表单中然后再insert到数据库,所以我们经常在这些功能中使用insertSelective方法,此时只针对我们操作的属性进行insert操作,而如果使用insert方法,将会把非表单内的内容置为null从而影响数据安全。

Mybatis选择插入,选择更新 Update insert Mapper示例

<update id="updateMethod" parameterType="com.zjl.domain">
    update table_name
    <set>
      <if test="id != null">
        id = #{id,jdbcType=BIGINT},
      </if>
      <if test="creater != null">
        creater = #{creater,jdbcType=VARCHAR},
      </if>
      <if test="modifiedDate != null">
        modified_date = #{modifiedDate,jdbcType=TIMESTAMP},
      </if>
    </set>
    where task_id = #{taskId,jdbcType=BIGINT}
  </update>
<insert id="insertSelective" parameterType="com.zjl.domain">
    insert into table_name
    <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="id != null">
    id,
    </if>
    <if test="createDate != null">
    create_date,
    </if>
    <if test="modifiedDate != null">
    modified_date,
    </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
    <if test="id != null">
    #{id,jdbcType=BIGINT},
    </if>
    <if test="createDate != null">
    #{createDate,jdbcType=TIMESTAMP},
    </if>
    <if test="modifiedDate != null">
    #{modifiedDate,jdbcType=TIMESTAMP},
    </if>
    </trim>
</insert>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java计时新姿势StopWatch的使用方法详解

    Java计时新姿势StopWatch的使用方法详解

    这篇文章主要给大家介绍了关于Java计时新姿势StopWatch的相关资料,以及java 中使用StopWatch来计算时间差的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Mybatis collection查询集合属性报错的解决方案

    Mybatis collection查询集合属性报错的解决方案

    这篇文章主要介绍了Mybatis collection查询集合属性报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java网络编程UDP实现消息发送及聊天

    Java网络编程UDP实现消息发送及聊天

    这篇文章主要为大家详细介绍了Java网络编程UDP实现消息发送及聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Spring中HandlerMethod类源码详细解析

    Spring中HandlerMethod类源码详细解析

    这篇文章主要介绍了Spring中HandlerMethod类源码详细解析,HandlerMethod类用于封装控制器方法信息,包含类信息、方法Method对象、参数、注解等信息,具体的接口请求是可以根据封装的信息调用具体的方法来执行业务逻辑,需要的朋友可以参考下
    2023-11-11
  • dubbo filter中有关bean注入和配置文件读取方式

    dubbo filter中有关bean注入和配置文件读取方式

    这篇文章主要介绍了dubbo filter中有关bean注入和配置文件读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • MyEclipse8.6首次运行maven项目图标上没有小M的标识怎么解决

    MyEclipse8.6首次运行maven项目图标上没有小M的标识怎么解决

    myeclipse8.6导入maven项目后识别为普通java项目,即项目图标上没有小M的标识。这时是无法直接运行的,怎么解决这一问题呢?下面小编给大家带来了解决方案,需要的朋友参考下吧
    2016-11-11
  • springboot集成redis lettuce

    springboot集成redis lettuce

    目前java操作redis的客户端有jedis跟Lettuce。本文主要介绍了springboot集成redis lettuce,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Spring Boot优雅地处理404异常问题

    Spring Boot优雅地处理404异常问题

    这篇文章主要介绍了Spring Boot优雅地处理404异常问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java实现Excel文件转PDF(无水印无限制)

    Java实现Excel文件转PDF(无水印无限制)

    这篇文章主要为大家详细介绍了如何利用Java语言实现Excel文件转PDF的效果,并可以无水印、无限制。文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • Hibernate命名策略详解

    Hibernate命名策略详解

    本文主要介绍了Hibernate命名策略。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论