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从而影响数据安全。