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以上
 
        mysql
        mysql-connector-java
        5.1.8
    
2.加上了参数useAffectedRows=true
如jdbc:mysql://localhost/db?useAffectedRows=true&


文/程忠 浏览次数:0次   2018-05-30 20:56:01

相关阅读

微信扫描-捐赠支持
加入QQ群-技术交流

评论: