注:如果是批量插入需要在 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. 知名金融媒体采访行业大咖,多方推动BGV茁壮成长

    近来,多家知名金融媒体如纽约金融时报.伦敦金融时报等采访NGK官方代表洛索斯夫,以及美国当地行业大咖马库斯等人. 受访的NGK官方代币洛索斯夫回答道,近期官方将会推出NGK的书籍<NGK公链底层 ...

  2. 「NGK每日快讯」11.24日NGK公链第22期官方快讯!

  3. Windows 常用命令与快捷键

    1.自选区截图Shift+win+s 2.全屏截图Prtsc 3.活动窗口截图Alt+Prtsc 4.新建文件夹Ctrl + Shift + N 5.返回上级目录Alt + 上方向键 6.后退到上一次 ...

  4. Java基本概念:多态

    一.简介 描述: 多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的.换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了.这对于大型系统来说能提高系统的灵活性和扩 ...

  5. 后端程序员之路 20、python复习

    Welcome to Python.orghttps://www.python.org/ 怎么用最短时间高效而踏实地学习 Python? - 知乎https://www.zhihu.com/quest ...

  6. 敏捷史话(八):敏捷的破局之道——Martin Fowler

    在 Martin Fowler 的世界里,任何事情都有最优解. 1963年,Martin 出生于英格兰的沃尔索尔(Walsall),也在同样位于沃尔索尔的玛丽女王文法学校中接受中等教育.在这里的乡村中 ...

  7. Linux发行版及其目标用户

    1.Debian Debian 众所周知,是Deepin,Ubuntu和Mint等流行Linux发行版的母亲,这些发行版提供了可靠的性能,稳定性和无与伦比的用户体验.最新的稳定发行版是Debian 1 ...

  8. 漏洞复现-Bash之一键破壳

        注:使用docker搭建测试环境 (1)访问搭建的环境网址:http://192.168.11.101:8081/ (2)使用burp拦截数据包,并修改User-Agent的内容: (3)使用 ...

  9. MySQL深入研究--学习总结(4)

    前言 接上文,继续学习后续章节.细心的同学已经发现,我整理的并不一定是作者讲的内容,更多是结合自己的理解,加以阐述,所以建议结合原文一起理解. 第13章<为什么表数据删除一般,表文件大小不变?& ...

  10. PHP配置 4. 虚拟主机配置open_basedir

    将/usr/local/php/etc/php.ini中open_basedir注释掉,编辑虚拟主机配置open_basedir #vim /usr/local/apache2 .4/conf/ext ...