欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-24 23:46:09
目录逆向自动生成的mybatis对应配置mapper文件里面,有两个方法,分别为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从而影响数据安全。