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 = wStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
final BoundSql boundSql = BoundSql();
final String sql = Sql();
final Statement stmt;
if (sql.equals(currentSql) && ms.equals(currentStatement)) {
int last = statementList.size() - 1;
stmt = (last);
BatchResult batchResult = (last);
batchResult.addParameterObject(parameterObject);
} else {
Connection connection = StatementLog());
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;
}
批量更新sql语句<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN" "/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器启⽤缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查询时,关闭关联对象即时加载以提⾼性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提⾼性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通⽤的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允许使⽤列标签代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许使⽤⾃定义的主键值(⽐如由程序⽣成的UUID 32位编码作为键值),数据表的PK⽣成策略将被覆盖 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 给予被嵌套的resultMap以字段-属性的映射⽀持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 对于批量更新操作缓存SQL以提⾼性能 -->
<!-- defaultExecutorType设置为BATCH有个缺陷就是⽆法获取update、delete返回的⾏数 --> <!-- <setting name="defaultExecutorType" value="BATCH" />-->
<!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="25000" />
<!-- ⽇志 -->
<!-- <setting name="logImpl" value="SLF4J"/> -->
</settings>
<!-- 注册mybatis插件 -->
<plugins>
<!-- mysql分页插件 -->
<plugin interceptor="batis.interceptor.MybatisPageInterceptor">
<property name="databaseType" value="mysql"/>
</plugin>
</plugins>
</configuration>
Mybatis Update返回值
mybatis sql:
<update id="test" parameterType="map">
update test_0731 set name = #{params.name}, age = #{params.age} where id = ${params.id} </update>
对应的java程序打印数字
(1)确实更新了某些字段的值
表数据:
提交的数据:更新id为1的记录,
返回的值是1,表⽰⼀条被更改
(2)被update但是update前后的数据是⼀样的
继续发送这个,数据,前后的数据⼀样
发现虽然没影响到值,但是返回的值还是1。
(3)没有匹配任何数据
请求的数据如下:
此时id为2,返回的数字是0。
所以update返回值是指match匹配到,⽽执⾏update语句的数量。
update返回值也是可以为boolean类型,当返回值为0时对应的boolean类型就是false, 如果不为零就是返回true 以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论