MyBatis插入Insert、InsertSelective的區(qū)別及使用心得
MyBatis插入Insert、InsertSelective的區(qū)別
逆向自動生成的mybatis對應(yīng)配置Mapper文件里面,有兩個方法,分別為insert和insertSelective。這兩個方法均是插入對象的方法。為什么會有兩個插入方法呢?
這里說一下兩者的區(qū)別
首先我們看代碼如下:
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>
從上面連段代碼我們會發(fā)現(xiàn)insertSelective對應(yīng)的sql語句加入了NULL校驗,只會插入數(shù)據(jù)不為null的字段值。insert則會插入所有字段,會插入null。
筆者反思但是為什么會有這兩種方法呢
總結(jié):由于真實開發(fā)中,我們在修改功能的from表單,或者一個類的某些模塊編輯的from表單中不會將所有的數(shù)據(jù)都查詢出來放到from表單中然后再insert到數(shù)據(jù)庫,所以我們經(jīng)常在這些功能中使用insertSelective方法,此時只針對我們操作的屬性進(jìn)行insert操作,而如果使用insert方法,將會把非表單內(nèi)的內(nèi)容置為null從而影響數(shù)據(jù)安全。
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>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot內(nèi)置tomcat之NIO處理流程一覽
這篇文章主要介紹了springboot內(nèi)置tomcat之NIO處理流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12解決Mybatis-Plus操作分頁后數(shù)據(jù)失效問題
這篇文章主要介紹了解決Mybatis-Plus操作分頁后數(shù)據(jù)失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11聊聊Controller中RequestMapping的作用
這篇文章主要介紹了Controller中RequestMapping的作用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀
這篇文章主要介紹了基于Spring中的事務(wù)@Transactional細(xì)節(jié)與易錯點、幻讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11