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

最新文章

  1. Linux杀死进程,查看进程
  2. ASP.NET MVC中viewData、viewBag和templateData的使用与区别
  3. python --- Python中的callable 函数
  4. C# Socket和TCP连接的区别
  5. http://blog.csdn.net/fw0124/article/details/48280083
  6. 【Java】Java原生的序列化和反序列化
  7. 让 PowerDesigner 支持 SQLite!
  8. Java 关于 == 和 equal()的区别
  9. 《Cortex-M0权威指南》之体系结构---程序映像和启动流程
  10. 使用Powermock进行单元测试,以及常见问题的处理
  11. nyoj 483 Nightmare【bfs+优先队列】
  12. selenium工具简介
  13. CSS系列------选择器和选择器的优先级
  14. Android Wear开发
  15. Python中threading的join和setDaemon的区别及用法
  16. 细说firewalld和iptables
  17. CentOS图形界面下如何安装Eclipse和使用maven
  18. AngularJS过滤排序思路
  19. [转]java中通过request获取路径中的不同信息
  20. SqlServer2008基础知识:安全与权限

热门文章

  1. css picture
  2. element-ui的树型结构图,半选状态数据给后台后,返回数据带有半选父节点的剔除展示
  3. CNN专访灵石CTO:Baccarat流动性挖矿能否持续?
  4. Baccarat是如何运用去中心化治理模式的?
  5. TERSUS无代码开发(笔记07)-简单实例手机端后台逻辑开发
  6. 配置Nginx的坑及思路
  7. 剑指 Offer 19. 正则表达式匹配 + 动态规划
  8. windows基线检测脚本编写指南-powershell版
  9. 一. MySQL基础语法
  10. Python开发环境从零搭建-03-安装Python解释器并配置