当前位置:首页 > 网络技术 > Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值)

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值)

longge@20222022-03-01 14:41:05网络技术314
目录
  • Mybatis执行Update返回行数为负数
    • 在官网上找到原因
  • Mybatis Update返回值
    • 对应的java程序打印数字

Mybatis执行Update返回行数为负数

获取mybatis的update行数,总是返回负数。

在官网上找到原因

是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。

其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。defaultExecutorType的默认执行器是SIMPLE。

名称 描述
SIMPLE 执行器执行其它语句
REUSE 可能重复使用prepared statements 语句
BATCH 可以重复执行语句和批量更新

由于项目配置中启用了BATCH执行器,UPDATE和DELETE返回的行数就丢失了,把执行器改为SIMPLE即可。

通过查看源码可以发现,batch执行器返回的是最大批量执行条数:

public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002; 
public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
    final Configuration configuration = ms.getConfiguration();
    final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
    final BoundSql boundSql = handler.getBoundSql();
    final String sql = boundSql.getSql();
    final Statement stmt;
    if (sql.equals(currentSql) && ms.equals(currentStatement)) {
      int last = statementList.size() - 1;
      stmt = statementList.get(last);
      BatchResult batchResult = batchResultList.get(last);
      batchResult.addParameterObject(parameterObject);
    } else {
      Connection connection = getConnection(ms.getStatementLog());
      stmt = handler.prepare(connection);
      currentSql = sql;
      currentStatement = ms;
      statementList.add(stmt);
      batchResultList.add(new BatchResult(ms, sql, parameterObject));
    }
    handler.parameterize(stmt);
    handler.batch(stmt);
    return BATCH_UPDATE_RETURN_VALUE;
  }
 


    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
 
    
    
        
        
            
        
    

Mybatis Update返回值

mybatis sql:


        update test_0731 set name = #{params.name}, age = #{params.age} where id = ${params.id}
    

对应的java程序打印数字

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值) 网络技术 第1张

(1)确实更新了某些字段的值

表数据:

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值) 网络技术 第2张

提交的数据:更新id为1的记录,

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值) 网络技术 第3张

返回的值是1,表示一条被更改

(2)被update但是update前后的数据是一样的

继续发送这个,数据,前后的数据一样

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值) 网络技术 第4张

发现虽然没影响到值,但是返回的值还是1。

(3) 没有匹配任何数据

请求的数据如下:

Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值) 网络技术 第5张

此时id为2,返回的数字是0。

所以update返回值是指match匹配到,而执行update语句的数量。

update返回值也是可以为boolean类型,当返回值为0时对应的boolean类型就是false, 如果不为零就是返回true

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。