MyBatis实现SaveOrUpdate

MyBatis实现SaveOrUpdate

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

例子==”BEFORE”>select count(*) from country where id = #{id} =”count > 0″>update countryset countryname = #{countryname},countrycode = #{countrycode}where id = #{id} =”count==0″>insert into country values(#{id},#{countryname},#{countrycode}) </if></insert>条件限制

根据不同的判断逻辑,会有所不同,,就上面这个例子而言,就要求实体类中包含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 [main] – ==> Preparing: select count(*) from country where id = ? DEBUG [main] – ==> Parameters: 35(Integer)TRACE [main] – <== Columns: C1TRACE [main] – <==Row: 1DEBUG [main] – <==Total: 1DEBUG [main] – ==> Preparing: update country set countryname = ?,countrycode = ? where id = ? DEBUG [main] – ==> Parameters: 中国(String), CN(String), 35(Integer)DEBUG [main] – <== Updates: 1DEBUG [main] – ==> Preparing: select * from country where id = ? DEBUG [main] – ==> Parameters: 35(Integer)TRACE [main] – <== Columns: ID, COUNTRYNAME, COUNTRYCODETRACE [main] – <==Row: 35, 中国, CNDEBUG [main] – <==Total: 1DEBUG [main] – ==> Preparing: select * from country where id = ? DEBUG [main] – ==> Parameters: 300(Integer)DEBUG [main] – <==Total: 0DEBUG [main] – ==> Preparing: select count(*) from country where id = ? DEBUG [main] – ==> Parameters: 300(Integer)TRACE [main] – <== Columns: C1TRACE [main] – <==Row: 0DEBUG [main] – <==Total: 1DEBUG [main] – ==> Preparing: insert into country values(?,?,?) DEBUG [main] – ==> Parameters: 300(Integer), 中国(String), CN(String)DEBUG [main] – <== Updates: 1DEBUG [main] – ==> Preparing: select * from country where id = ? DEBUG [main] – ==> Parameters: 300(Integer)TRACE [main] – <== Columns: ID, COUNTRYNAME, COUNTRYCODETRACE [main] – <==Row: 300, 中国, CNDEBUG [main] – <==Total: 1最后

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

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

MyBatis工具:

我们摇摇头说,困难其实没什么大不了。

MyBatis实现SaveOrUpdate

相关文章:

你感兴趣的文章:

标签云: