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

mysql 批量操作,已存在则修改,不存在则insert,同时判断空选择性写入字段的更多相关文章

  1. mysql更改已有数据表的字符集,保留原有数据内容

    mysql更改已有数据表的字符集,保留原有数据内容     原文网址:http://blog.csdn.net/learn_2/article/details/6460370 环境:在应用开始阶段没有 ...

  2. MySQL使用pt-online-change-schema工具在线修改1.6亿级数据表结构

    摘  要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数 ...

  3. 忘记mysql数据库密码时进行修改方法

    长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件夹( ...

  4. MySQL 给已存在的数据表 增加字段和注释

    MySQL 给已存在的数据表 增加字段和注释 问题描述 在开发一个系统的过程中,经常会遇到随着系统服务功能的扩展,或者服务之间的关联,需要适当的修改原有的表结构,比如,增加一些必要的字段. 示例:在已 ...

  5. MySQL根据表前缀批量修改、删除表

    注意:请先调试好,以及做好备份,再执行操作. 批量修改表 批量给前缀为 xushanxiang_content_ 的表增加一个 username 的字段: SELECT CONCAT('ALTER T ...

  6. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

  7. 本地mysql数据库root密码丢失修改方法

      1,停止数据库 2,cd /etc/mysql 3,利用vim命令打开mysql配置文件my.cnf,在mysqld进程配置文件中添加skip-grant-tables,添加完成后,执行wd保存. ...

  8. (转) mysql的连接,创建账号,修改密码

    原文:http://blog.chinaunix.net/uid-20749043-id-1878306.html  mysql的连接,创建账号,修改密码 2008-10-13 15:31:29 分类 ...

  9. MySQL追加注释或者大量修改注释

     MySQL追加注释或者大量修改注释 2016-01-25 20:28:05 分类: MySQL MySQL 5.6.14 之前一个项目比较仓促,开发给的建表语句没有注释.现在要补全注释信息.但是My ...

随机推荐

  1. react hooks & props change & pagination current bug

    react hooks & props change & pagination current bug multi tables & pigination bug & ...

  2. Flutter: IntrinsicWidth类,将孩子的宽度调整为孩子的最大内在宽度

    文档 原文 class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePage ...

  3. 如何快速搞定websocket

    5 个步骤快速掌握websocket消息发送和接收 1. 获取您的 appkey 先注册一个账号,登录后,创建一个应用,就能得到您的 appkey. 详情见 获取开发者账号和 appkey 2. 客户 ...

  4. 1. VUE介绍

    今天开始系统学习vue前端框架. 我是有前端基础的, 刚工作那会, 哪里分那么清楚啊, 前后端我都得做, 所以, css, js, jquery, bootstrap都会点, 还系统学过ext, 哈哈 ...

  5. ElasticSearch 聚合分析

    公号:码农充电站pro 主页:https://codeshellme.github.io ES 中的聚合分析(Aggregations)是对数据的统计分析功能,它的优点是实时性较高,相比于 Hadoo ...

  6. TERSUS无代码开发(笔记05)-简单实例电脑端页面设计

    案例笔记电脑端页面设计   1.新建项目(请假管理qjgl)   2.开发软件界面介绍(常用的功能按键)      3.目录中显示元件对象      4.对元件对象的操作主要方式是双击(双击哪个元件, ...

  7. Docker Elasticsearch 集群配置

    一:选用ES原因 公司项目有些mysql的表数据已经超过5百万了,各种业务的查询入库压力已经凸显出来,初步打算将一个月前的数据迁移到ES中,mysql的老数据就物理删除掉. 首先是ES使用起来比较方便 ...

  8. 多Excel文件内容查询工具。

    多Excel文件内容查询工具. 告别繁琐重复的体力劳动,一分钟干完一天的活. 码云 github 下载 当需要在多个Excel表格中查询需要的信息是,一个文件一个文件的去查询非常麻烦. 虽然有其他方法 ...

  9. 区分函数防抖&函数节流

    1. 概念区分 函数防抖:触发事件后,在n秒内函数只能执行一次,如果触发事件后在n秒内又触发了事件,则会重新计算函数延执行时间. 简单说: 频繁触发, 但只在特定的时间内才执行一次代码,如果特定时间内 ...

  10. 《C++ Primer》笔记 第4章 表达式

    C++的表达式要不然是右值(right-value or read-value),要不然就是左值(left-value or location-value). 当一个对象被用作右值的时候,用的是对象的 ...