java ibatis mysql_利用Ibatis实现Mysql中的不重复插入记录

以下讨论全部针对Mysql数据库:)

通常业务上至少需要两种类型的不重复插入记录的需求:

如果某些关键字段已经在Mysql中存在了,不要重复插入,而是改为更新某些字段。

如果某些关键字段已经在Mysql中存在了,不要重复插入,也不需要做更新操作,直接忽略即可。

1、针对上面的第一种,mysql提供了insert into ... on duplicate key update ... 语法(Mysql自己的语法,不属于标准SQL)来实现。这种场景相对常见。使用的前提是,需要定义主键或者唯一性索引,用来告诉Mysql哪些字段的重复会造成主键冲突或者违背唯一性约束条件。当这些情况出现时,就放弃insert操作,转而执行后面的update操作。上一个具体的例子,在ibatis中写的一个上面逻辑的sql:

parameterClass="com.alibaba.ais.bdc.person.dataobject.UserInfo">

insert into T_USER_INFO (employ_id,fans_count,follow_count)

values (#employId#,#fansCount#,#followCount#)

ON DUPLICATE KEY UPDATE follow_count=follow_count+1

上面的插入操作就会在employ_id发生主键冲突的时候,转变为更新follow_count字段(自增一个单位)。

2、针对上面的第二种,mysql提供了insert ignore into ... 语法(Mysql自己的语法,不属于标准SQL)来实现。这种场景相对要少见一些。 使用的前提是,需要定义主键或者唯一性索引,原因同上面一致。但不同的就是,违背唯一性约束时,直接忽略这次insert操作,然后啥也不干了,也不会报错。。。

但这里有个问题,就是有时业务本身还是需要知道语句到底执行了insert还是没有执行!因为需要根据这个反馈信息,做出不同的处理逻辑。这里给出使用ibatis时,两种不同的处理方法。

借助mysql的内置函数row_count()和ibatis的selectKey标签:

关于ibatis的selectKey标签,更为常见的用法是在插入对象到DB之后,返回DB自增产生的主键ID。比如:

insert into T_TEST(WATCHER, WATCHEE) values (#watcher#,#watchee#)

select last_insert_id() as ID from dependency limit 1

通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得这个DB自增产生的ID:

Integer id = (Integer) sqlMapClient.insert("testSelectKey", param);

row_count()是Mysql提供可以获得insert、update、delete这几种操作成功处理行数的一个内置函数,有了这个函数,再结合上面给出的selectKey标签的例子,就可以做到获得insert ignore时,成功insert的行数。有了这个行数,也就知道了到底有没有发生insert操作。(发生了插入操作该函数返回值会大于0),于是改编一下上面的sql-map中的sql(注意其中的ignore关键字):

insert ignore into T_TEST(WATCHER, WATCHEE) values (#watcher#,#watchee#)

select row_count() as ID from T_USER_RELATION limit 1

通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得insert真正影响到的行数:

Integer affectedRows = (Integer)sqlMapClient.insert("testInsertIgnore", param);

利用ibatis的update语句:上面之所以要费劲周折的修改insert语句,时因为ibatis本身的insert不是默认支持返回影响的行数的。但是update语句支持!于是,另外一个思路,就是利用update语句来完成这个insert操作。

insert ignore into T_USER_RELATION(WATCHER, WATCHEE) values (#watcher#,#watchee#)

通过上面语句进行插入操作之后,可以通过如下方式在Java代码中获得insert真正影响到的行数(这里需要注意的是,Java代码中需要使用sqlMapClient的update的API哦):

Integer affectedRows = (Integer)sqlMapClient.update("testInsertIgnore", param);

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-10-08 20:57

浏览 22219

分类:数据库

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值