Mybatis执行Update返回行数为负数的问题_java(mybatis update返回值)
目录
- 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程序打印数字
(1)确实更新了某些字段的值
表数据:
提交的数据:更新id为1的记录,
返回的值是1,表示一条被更改
(2)被update但是update前后的数据是一样的
继续发送这个,数据,前后的数据一样
发现虽然没影响到值,但是返回的值还是1。
(3) 没有匹配任何数据
请求的数据如下:
此时id为2,返回的数字是0。
所以update返回值是指match匹配到,而执行update语句的数量。
update返回值也是可以为boolean类型,当返回值为0时对应的boolean类型就是false, 如果不为零就是返回true