注:如果是批量插入需要在 Java 連接數據庫的字串中設置 &allowMultiQueries=true
針對單行數據有則修改無則新增
本案例的建表語句是:
-- auto-generated definition create table contact_type ( sid varchar(50) not null primary key, name varchar(50) default '' null, status int default 1 null comment '狀態,默認1表示有效,0為凍結', seq float default 0 null, create_time datetime default CURRENT_TIMESTAMP null ) comment '往來單位類型'
所以主鍵是字符串類型,而不是自增類型。寫在 Mybatis 的 xml 文件中的SQL語句如下:
<insert id="saveOne" parameterType="com.ccsoft.femis.model.ContactType"> <!--<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">--> <!--SELECT LAST_INSERT_ID()--> <!--</selectKey>--> insert into contact_type <trim prefix="(" suffix=")" suffixOverrides=","> <if test="create_time != null"> create_time, </if> <if test="name != null"> name, </if> <if test="seq != null"> seq, </if> <if test="sid != null"> sid, </if> <if test="status != null"> status, </if> </trim> values <trim prefix="(" suffix=")" suffixOverrides=","> <if test="create_time != null"> #{create_time},</if> <if test="name != null"> #{name},</if> <if test="seq != null"> #{seq},</if> <if test="sid != null"> #{sid},</if> <if test="status != null"> #{status},</if> </trim> ON DUPLICATE KEY UPDATE <trim suffixOverrides=","> <if test="create_time != null"> create_time = #{create_time}, </if> <if test="name != null"> name = #{name}, </if> <if test="seq != null"> seq = #{seq}, </if> <if test="sid != null"> sid = #{sid}, </if> <if test="status != null"> status = #{status}, </if> </trim> </insert>
批量寫入數據有則修改無則新增,同時判斷空選擇性寫入字段
數據表還是上面的,直接貼出寫在 Mybatis 的 XML 文件中的 SQL 是:
<insert id="saveBatch" parameterType="java.util.List"> <!--<selectKey resultType="java.lang.String" keyProperty="sid" order="AFTER">--> <!--SELECT LAST_INSERT_ID()--> <!--</selectKey>--> <foreach collection ="list" item="ele" index= "index" separator =";"> insert into contact_type <trim prefix="(" suffix=")" suffixOverrides=","> <if test="ele.create_time != null"> create_time, </if> <if test="ele.name != null"> name, </if> <if test="ele.seq != null"> seq, </if> <if test="ele.sid != null"> sid, </if> <if test="ele.status != null"> status, </if> </trim> values <trim prefix="(" suffix=")" suffixOverrides=","> <if test="ele.create_time != null"> #{ele.create_time},</if> <if test="ele.name != null"> #{ele.name},</if> <if test="ele.seq != null"> #{ele.seq},</if> <if test="ele.sid != null"> #{ele.sid},</if> <if test="ele.status != null"> #{ele.status},</if> </trim> ON DUPLICATE KEY UPDATE <trim suffixOverrides=","> <if test="ele.create_time != null"> create_time = #{ele.create_time}, </if> <if test="ele.name != null"> name = #{ele.name}, </if> <if test="ele.seq != null"> seq = #{ele.seq}, </if> <if test="ele.sid != null"> sid = #{ele.sid}, </if> <if test="ele.status != null"> status = #{ele.status}, </if> </trim> </foreach> </insert>
上面代碼中在 SQL 語句的最外層使用了 for 循環,好處是將 List<ContactType> 類型的集合傳遞來寫入數據時可以有的是新增有的是修改,例如3行數據,第一三行由於主鍵字段對應屬性 sid 被設置為 NULL ,會向數據庫中新增行,第二行數據設置了 sid ,並且該值在數據庫中有對應行,那么會修改數據庫中的該行上的數據。不過這種做法也有問題,就是返回給 Java 的數據永遠都是1,因為每個對象構成的 SQL 語句間使用的間隔符號是 ; ,那么最終返回的影響的行數是最后一條 SQL 語句影響的行數。對此有其他見解的話麻煩跟帖科普下
原文鏈接:https://blog.csdn.net/chanchaw/article/details/103546087
