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