使用Mybatis 3.4.6进行Oracle批量更新,并获得-1“;结果

使用Mybatis 3.4.6进行Oracle批量更新,并获得-1“;结果,oracle,mybatis,Oracle,Mybatis,我的代码如下: mybatis: configuration: default-executor-type: simple 更新 商务 冻结金额=nvl(冻结金额,0)+{item.payamunt} 哪里 id=#{item.cardd} 当使用整数时,我总是得到-1的结果;当使用布尔值时,我总是得到错误的结果 我试着这样做application.yml: mybatis: configuration: default-executor-t

我的代码如下:

mybatis:
    configuration:
        default-executor-type: simple

更新
商务
冻结金额=nvl(冻结金额,0)+{item.payamunt}
哪里
id=#{item.cardd}
当使用整数时,我总是得到-1的结果;当使用布尔值时,我总是得到错误的结果 我试着这样做
application.yml

mybatis:
    configuration:
        default-executor-type: simple
看来没关系。
那么,如何获得oracle批处理更新的正确结果呢?

这不是批处理操作。
它试图用一个
PreparedStatement\execute()
调用执行多个语句,Oracle的JDBC驱动程序不支持它(更正:驱动程序支持它)。
正确的方法是执行真正的批处理操作

mapper语句包含一个普通的UPDATE语句


更新业务tbl
设置冻结金额=nvl(冻结金额,0)+{payAmount}
其中id=#{cardId}
下面的代码执行批处理操作

SqlSession SqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
试一试{
对于(您的项目:列表){
sqlSession.update(“业务更新”,项目);
}
List results=sqlSession.flushStatements();
int totalNumberOfAffectedRows=Arrays.stream(results.get(0.getUpdateCounts()).sum();
提交();
}最后{
sqlSession.close();
}
  • sqlSession#flushStatements()
    返回
    BatchResult
    的列表。在本例中,批处理中只有一条语句,因此列表大小为1。如果执行多条语句(例如更新表A,然后插入表B),列表可能包含多条
    BatchResult
    s
  • BatchResult#getUpdateCounts()
    返回一个int数组。第一个元素(=int)是第一次更新更新的行数,第二个元素是第二次更新更新的行数,依此类推
  • 如果要更新多行,则应间歇刷新语句。有关如何控制批量大小,请参阅

您必须升级到Oracle 12或更高版本-请参阅类似答案