博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis实现SaveOrUpdate
阅读量:5890 次
发布时间:2019-06-19

本文共 2437 字,大约阅读时间需要 8 分钟。

这篇文章主要讲如何通过xml方式实现SaveOrUpdate,但是仍然建议在Service中实现。

例子

select count(*) from country where id = #{id}
update country set countryname = #{countryname},countrycode = #{countrycode} where id = #{id}
insert into country values(#{id},#{countryname},#{countrycode})

 

条件限制

根据不同的判断逻辑,会有所不同,就上面这个例子而言,就要求实体类中包含count属性(可以是别的名字)。否则selectKey的结果没法保存,如果入参是个Map类型,就没有这个限制。

说明

从例子来看除了有个限制外,也没别的麻烦。

通过selectKey做第一次查询,然后根据结果进行判断,所以这里的order="BEFORE"是必须的。

也是因为BEFORE,所以没法通过<bind>标签来临时存储中间的值,只能在入参中增加属性来存放。

测试代码

//数据库中已经存在该ID,但是countryname=ChinaCountry country = new Country();country.setId(35);country.setCountryname("中国");country.setCountrycode("CN");//由于存在,这里会updateint result = countryMapper.saveOrUpdate(country);//查询结果,判断是否已经改变Country c2 = countryMapper.selectById(35);assertEquals("中国",c2.getCountryname());//id=300的不存在c2 = countryMapper.selectById(300);assertNull(c2);//将id=300country.setId(300);//由于id=300不存在,这里会Insertresult = countryMapper.saveOrUpdate(country);//查询结果c2 = countryMapper.selectById(300);assertNotNull(c2);

 

输出日志

DEBUG ==>  Preparing: select count(*) from country where id = ? DEBUG ==> Parameters: 35(Integer)TRACE <==    Columns: C1TRACE <==        Row: 1DEBUG <==      Total: 1DEBUG ==>  Preparing: update country set countryname = ?,countrycode = ? where id = ? DEBUG ==> Parameters: 中国(String), CN(String), 35(Integer)DEBUG <==    Updates: 1DEBUG ==>  Preparing: select * from country where id = ? DEBUG ==> Parameters: 35(Integer)TRACE <==    Columns: ID, COUNTRYNAME, COUNTRYCODETRACE <==        Row: 35, 中国, CNDEBUG <==      Total: 1DEBUG ==>  Preparing: select * from country where id = ? DEBUG ==> Parameters: 300(Integer)DEBUG <==      Total: 0DEBUG ==>  Preparing: select count(*) from country where id = ? DEBUG ==> Parameters: 300(Integer)TRACE <==    Columns: C1TRACE <==        Row: 0DEBUG <==      Total: 1DEBUG ==>  Preparing: insert into country values(?,?,?) DEBUG ==> Parameters: 300(Integer), 中国(String), CN(String)DEBUG <==    Updates: 1DEBUG ==>  Preparing: select * from country where id = ? DEBUG ==> Parameters: 300(Integer)TRACE <==    Columns: ID, COUNTRYNAME, COUNTRYCODETRACE <==        Row: 300, 中国, CNDEBUG <==      Total: 1

 

最后

这种方式只是利用了selectKey会多执行一次查询来实现的,但是如果你同时还需要通过selectKey获取序列或者自增的id,就会麻烦很多(麻烦,其他支持自增的还是很容易)。

建议在复杂情况下,还是选择在Service中实现更好。

MyBatis工具:

http://blog.csdn.net/isea533/article/details/45578415

 

你可能感兴趣的文章
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
hive中如何把13位转化为时间_sqoop1 导入 hive parquet 表中 时间戳调整为日期
查看>>
mysql书外键_[转] mysql 外键(Foreign Key)的详解和实例
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
python入门小游戏代码_【Python】Python代码实现“FlappyBird”小游戏
查看>>
云服务器怎么卸载mysql数据库_mysql 删除数据库脚本
查看>>
mysql 5.5.57互为主从_MYSQL 5.5.18 互为主从配置成功
查看>>
mysql5002_mysql新手进阶02
查看>>
python类 del_全面了解Python类的内置方法
查看>>
前后端传图片用base64好吗_前后端分离 前台传base64的图片 tp5.1.1进行处理
查看>>
java对象的排序_Java对象排序两种方法
查看>>
java jni 原理_使用JNI技术实现Java和C++的交互
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
Ubuntu 12.04安装
查看>>
mysql client命令行选项
查看>>
vc遍历网页表单并自动填写提交 .
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>
设计模式:外观模式(Façade Pattern)
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>