栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis返回值问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis返回值问题

遇到问题就要解决,不然永远迷迷糊糊,解决后发现也没那么难



问题: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:向服务器请求连接所使用的字符集,默认:无



相关文章:

文章一

文章二

文章三

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/285339.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号