mybatis执行update返回的数字是什么
mybatis的Mapper文件的Update标签可以返回一个整型数,我常怀疑这个是更新的数量还是是否更新成功的标识。
为回答这个问题,我还是debug进入update方法,可以得到堆栈如下:
MapperMethod.execute(SqlSession, Object[]) line: 62 的代码详情是调用org.mybatis.spring.SqlSessionTemplate.update
这个类在mybatis-spring-1.3.1.jar里,它会回调ibatis的sqlSession.update方法:
这个方法的sqlSession参数类名为org.apache.ibatis.session.defaults.DefaultSqlSession,也就说实际上是这个类的实例执行的方法。下面是它的方法实现:
@Override public int update(String statement, Object parameter) { try { dirty = true; MappedStatement ms = configuration.getMappedStatement(statement); return executor.update(ms, wrapCollection(parameter)); } catch (Exception e) { throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } }
同样的方法,可以查到它使用org.apache.ibatis.executor.CachingExecutor.update
再封装一层:
SimpleExecutor(BaseExecutor).update(MappedStatement, Object) line: 112
再来一层:
SimpleExecutor.doUpdate(MappedStatement, Object) line: 50
最后终于见到了庐山真面目:java.sql.PreparedStatement.getUpdateCount()
哈,就这么简单,打开jdk文档查一下:
好了,就是返回的更新数量.
同样的,如果执行
insert也是用的是这个方法,返回的是同样的意义的值。
这里有个问题,他是匹配的行数,还是匹配后更新的行数?
这与mysql版本和jdbc连接url参数有关。首先
默认的就是返回匹配行数。
如果需要返回的是匹配后更新的行数,需要两个条件(前提mysql服务器是5.5以上):
1.mysql-jdbc是5.1.8以上
<dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.8</version> </dependency>
2.加上了参数useAffectedRows=true
如jdbc:mysql://localhost/db?useAffectedRows=true&
相关阅读
微信扫描-捐赠支持
加入QQ群-技术交流
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑