mybatis的selectkey标签多数据源这中情况怎么处理啊

前提:我现在有三种数据库 分别是 oracle、mysql、pg
场景:现在使用mybatis操作表,执行insert语句,但是我需要返回当前这次插入的主键,其中mysql的主键已被设置为自增,oracel和pg是通过序列查询的
问题:在执行插入的时候,使用selectkey获取本次插入的主键,但是oracle和pg是通过对应的序列查询的,所以selectkey的order 要被设置为 before 。mysql是通过 LAST_INSERT_ID()这个函数,它的order只能被设置为 after

失败方法
1、selectkey和useGeneratedKeys=“” keyProperty=“” 配合使用,这种只有在特定的mysql版本下才可以
2、在insert和selectkey标签上设置对应的database,这种在项目启时数据源就被定死了,不能实现切换,然后就是selectkey标签不能方进任何的判断标签。

解决方案:
方法一:

不使用selectkey只使用mybatis的useGeneratedKeys="true" keyProperty="主键" keyColumn="主键"在oracle上对应的表的主键上创建对应的触发器,mysql主键设置成自增,pg上再主键上创建对应的序列,主键绑定这个序列,这样pg也就实现了主键自增,这样就不需要考虑是在之前还是之后 插入了,他都可以返回插入的bsm

方法二:

使用selectkey,因为selectkey只能在插入之前或之后进行查询,但是我们pg和oracle都是查询序列进行插入的,所以只能在之前,那么我们可以在mysql创建一个类似LAST_INSTER_ID()的函数,这样就可以完美解决。但是这种存在弊端,不适用多线程的插入。

关于这个函数的创建sql如下 就是通过mysql的系统表 information_schema 来查询某个库下具体表的自增id的情况,参数第一个是库名 第二个是 表名.
注意:使用这种mysql的主键必须自增,不自增不行。

CREATE DEFINER=`root`@`%` FUNCTION `LAST_INSERT_NEW_ID`(param1 VARCHAR(50),  param VARCHAR(50)) RETURNS int(11)
    READS SQL DATA
    DETERMINISTIC
BEGIN
     DECLARE value INTEGER;
     SET value = 0;
SELECT AUTO_INCREMENT INTO value
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = param1
  AND TABLE_NAME = param;
RETURN value;
END

持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值