zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    68
    56
    Django manager 命令笔记
    Django 执行 manage 命令方式
    Django 连接 Mysql (8.0.16) 失败
    Python django 安装 mysqlclient 失败
    H.264 SODB RBSP EBSP的区别
    FFmpeg—— Bitstream Filters 作用
    MySQL 远程连接问题 (Windows Server)
    MySQL 笔记
  • 原文地址:https://www.cnblogs.com/shianliang/p/12364582.html
Copyright © 2011-2022 走看看