首页 > 代码库 > MyBatis实现SaveOrUpdate
MyBatis实现SaveOrUpdate
这篇文章主要讲如何通过xml方式实现SaveOrUpdate,但是仍然建议在Service中实现。
例子
<insert id="saveOrUpdate" > <selectKey keyProperty="count" resultType="int" order="BEFORE"> select count(*) from country where id = #{id} </selectKey> <if test="count > 0"> update country set countryname = #{countryname},countrycode = #{countrycode} where id = #{id} </if> <if test="count==0"> insert into country values(#{id},#{countryname},#{countrycode}) </if></insert>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
条件限制
根据不同的判断逻辑,会有所不同,就上面这个例子而言,就要求实体类中包含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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
输出日志
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
最后
这种方式只是利用了selectKey会多执行一次查询来实现的,但是如果你同时还需要通过selectKey获取序列或者自增的id,就会麻烦很多(Oracle麻烦,其他支持自增的还是很容易)。
建议在复杂情况下,还是选择在Service中实现更好。
MyBatis工具:www.mybatis.tk
http://blog.csdn.net/isea533/article/details/45578415
MyBatis实现SaveOrUpdate
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。