mybatis 使用dblink 执行insert 报ora-22816 returning 子句不支持的功能问题解决方法

一、解决方案:

...

改成

...

注意:针对主键需要通过标签方式获取的不适用,因为此方式获取到的KeyGenerator 与普通的insert不一样,不需要更改,

    并且更改为update会直接报错

二、原因分析:

已采用PREPARED为例。

mybatis 需要在执行语句的过程中获取对应的statement对象,这个对象获取方式会根据KeyGenerator的实例对象不同而调用不同方法,包含KeyGenerator对象的mappedStatement 是根据 mybtis方法标签获得,如下图:mybatis 使用dblink 执行insert 报ora-22816 returning 子句不支持的功能问题解决方法_第1张图片

 普通insert 获取到的KeyGenerator对象是 Jbdc3KeyGenerator,调用的connection.prepareStatement(sql, keyColumnNames) 、 ,statement对象中的SQL会被修改,增加returning子句内容,这才是真正执行的SQL语句,但是oracle包含dblink的SQL本身就不支持使用 returning,因此报错信息提示 returning 子句不支持的功能。

insert标签改成update后,在MapperMathod.class中获得的KeyGenerator 是NoKeyGenerator,实际执行的SQL与传入的SQL语句一直,不会进行修改包装,因此可以执行成功

mybatis 使用dblink 执行insert 报ora-22816 returning 子句不支持的功能问题解决方法_第2张图片


你可能感兴趣的:(java,mybatis)