• mysql 批量操作,已存在则修改,不存在则insert,同时判断空选择性写入字段


    注:如果是批量插入需要在 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

  • 相关阅读:
    SQL_Server_2005_启用远程连接
    Oracle外网或内网远程连接
    还原数据库到指定时间点
    SQL Server账号密码(sa)登录失败 错误原因:18456
    sql server如何设置密码过期时间呢?
    安装SQL Server2014 :规则”Windows Management Instrumentation (WMI)服务 “失败
    impala
    dolphinscheduler
    829. Consecutive Numbers Sum 连续的数字求和
    472. Concatenated Words 查找自己拼出来的单词 反向word break
  • 原文地址:https://www.cnblogs.com/shianliang/p/12364582.html
Copyright © 2020-2023  润新知