遇到问题就要解决,不然永远迷迷糊糊,解决后发现也没那么难
问题:Mybatis中的增,修改,删除返回的到底是什么意思?
初期:刚实习那会,自学的Mybatis,只会基本的使用,根本不关心这些细节问题
实习初期:看到别人这么娴熟,跟着用就好了,管那么多干啥呢……
毕技术中等期:后来想到个问题,看到别人返回的result直接和0比较,发现不太对啊,好像不只是改变了这么多行数……
代码如下:
// 更新分类状态
int result = categoryMapper.updateCategoryStatus(categoryStatusUpdateDTO.getCategoryStatus(),
categoryStatusUpdateDTO.getCategoryId(), new Date(), uid);
if (result == 0) {
// 更新失败回滚
throw new RollBackException("update is error");
}
反思:一堆困惑涌上心头,实在受不了了,太难受了,如果修改的个数更多呢,公司这种类似的代码返回的永远是0,不管返回的Integer是什么,是影响的行数还是匹配的行数,这种都是不正确的思想,只能说明公司的代码不够规范,一堆毛病,这只是其中之一
正确的应该是从数据库中查满足响应的行数是多少,返回一个Size,将result和size对比,不相等则抛异常进行回滚
先解决了个规范问题,那么问题又来了,那个result返回的到底是个什么玩意,真的是影响的行数吗(之前一直这么以为),如果是影响的行数,那么我之前的想法就可能有问题,要是一个人叫做冬冬,将他名字改为冬冬,那不影响的行数就是0吗,为了这个,决定测试一番:
运行测试用例, 证明mapper返回的确实是匹配的行数
不过 可以返回实际修改的记录数, 需要在jdbcUrl上加上
useAffectedRows=true
加上这个后mapper返回的就是影响的行数了,和mysql返回值类似(mysql返回的就是影响的行数,例如如果修改的值是原来那个值,mysql就会直接返回0)
这也就证明了我上述的想法是正确的,如果返回的是匹配的行数,那么就可以从数据库中捞数据了,然后判断是否相等就可以了,反之如果是影响则是万万不可以的,会导致判断有误
相关参数:
其他常见常用参数: UsePerformanceMonitor,userperfmon, perfmon:是否启用性能监视,默认 false IgnorePrepare: 是否忽略 Prepare() 调用,默认 true UseProcedureBodies,procedure bodies:是否检查存储过程体、参数的有效性,默认 true AutoEnlist: 是否自动使用活动的连接,默认 true TreatTinyAsBoolean:是否将 TINYINT(1) 列视为布尔型,默认 true AllowUserVariables:是否允许 SQL 中出现用户变量,默认 false FunctionsReturnString:所有服务器函数是否按返回字符串处理,默认 false UseAffectedRows:是否用受影响的行数替代查找到的行数来返回数据,默认 false Keepalive: 保持 TCP 连接的秒数,默认0,不保持。 ConnectionLifeTime:连接被销毁前在连接池中保持的最少时间(秒)。默认 0 Pooling: 是否使用线程池,默认 true MinimumPoolSize, min pool size:线程池中允许的最少线程数,默认 0 MaximumPoolSize,max pool size:线程池中允许的最多线程数,默认 100 ConnectionReset:连接过期后是否自动复位,默认 false CharacterSet, charset:向服务器请求连接所使用的字符集,默认:无 其他常见常用参数: UsePerformanceMonitor,userperfmon, perfmon:是否启用性能监视,默认 false IgnorePrepare: 是否忽略 Prepare() 调用,默认 true UseProcedureBodies,procedure bodies:是否检查存储过程体、参数的有效性,默认 true AutoEnlist: 是否自动使用活动的连接,默认 true TreatTinyAsBoolean:是否将 TINYINT(1) 列视为布尔型,默认 true AllowUserVariables:是否允许 SQL 中出现用户变量,默认 false FunctionsReturnString:所有服务器函数是否按返回字符串处理,默认 false UseAffectedRows:是否用受影响的行数替代查找到的行数来返回数据,默认 false Keepalive: 保持 TCP 连接的秒数,默认0,不保持。 ConnectionLifeTime:连接被销毁前在连接池中保持的最少时间(秒)。默认 0 Pooling: 是否使用线程池,默认 true MinimumPoolSize, min pool size:线程池中允许的最少线程数,默认 0 MaximumPoolSize,max pool size:线程池中允许的最多线程数,默认 100 ConnectionReset:连接过期后是否自动复位,默认 false CharacterSet, charset:向服务器请求连接所使用的字符集,默认:无
文章一
文章二
文章三



