电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

解決Mybatis中mapper.xml文件update,delete及insert返回值問題

瀏覽:135日期:2023-10-21 15:01:01

最近寫了幾個非常簡單的接口(CRUD),在單元測試的時候卻出了問題,報錯如下:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ’messageListener’: Unsatisfied dependency expressed through field ’reviewCheckInfoService’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ’reviewCheckInfoServiceImpl’: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ’reviewCheckInfoDao’ defined in file [/Users/a1475368628/IdeaProjects/baby-customer-parent/baby-customer-service/target/classes/com/dianping/baby/customer/reviewcheck/dao/ReviewCheckInfoDao.class]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:

PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property ’sqlSessionFactory’ threw exception; nested exception is java.lang.NullPointerException

經過仔細排查,問題的原因出在sql的xml配置文件出錯,直接原因是在update中錯誤的使用了KeyProperty、useGeneratedKeys。

學習相關知識之后,在這里仔細總結一下。

在Mybatis的xml配置文件中,insert和update中可以設置屬性KeyProperty、useGeneratedKeys,用來返回自增主鍵的值。

在DAO層中有一個方法:

public int addUser(@Param('user')User user);

對應的xml文件中為:

<insert id='addUserType='map' keyProperty='user.id' useGeneratedKeys='true'> INSERT INTO a_user ( AgeType, CityId, AddTime, UpdateTime ) VALUES ( #{user.ageType}, #{user.cityId}, NOW(), NOW() )</insert>

我錯誤的認為是addUser()這個方法會返回插入記錄的自增id值,結果測試的時候,addUser()方法返回值始終是1。仔細學習后得知:

insert對應的方法返回值為插入數(shù)據庫的條數(shù)(如上,每次插入一條數(shù)據,所以每次addUser()都是返回1)

update對應的方法返回值為匹配數(shù)據庫的條數(shù)(不論最終是否對數(shù)據進行了修改,只要某條記錄符合匹配條件,返回值就加1)

舉例:

update table_name set name='li' where cid = 3.

假如數(shù)據庫中有2條數(shù)據如下:

1. name:li cid=3

2. name:ly cid=3

這兩條數(shù)據都符合update匹配條件,但是第1條數(shù)據不需要修改,只是更改了第2條數(shù)據的name值,最終返回值依舊為2

delete對應方法返回值為刪除的數(shù)據條數(shù)

而KeyProperty、useGeneratedKeys這兩個屬性是用來設置user對象中的id值(id為自增主鍵)的。

User user = new User();user.setAgeType(1); user.setCityId(1);addUser(user);System.out.println(user.id);

如上,我們并沒有設置user對象的id值,但是卻能輸出正確的id。

當然,使用 selectKey也能達到同樣的效果

解決Mybatis中mapper.xml文件update,delete及insert返回值問題

補充知識:Mybatis Update操作 返回值修改為受影響條數(shù)

到底 update 返回值代表什么呢?我們來驗證一下便知道了,假設有如下一張表以及兩條數(shù)據:

我們來編寫一個簡單的單元測試用例來驗證下,首先使用 mybatis 簡單的寫個 mapper 進行更新操作,其中 xml 中的內容為:

數(shù)據庫連接配置為:

接來下,我們來編寫一個簡單的單元測試來驗證下: update 的返回值是不是受影響的記錄的條數(shù) ,對應的單元測試代碼如下:

由單元測試代碼可以得知,我們將要把數(shù)據庫中兩條記錄的 phone 字段的值由 12345678 修改為 66666666 ,正常情況下, resultCode 將會返回 2 。因為 update 操作影響到數(shù)據庫中這 2 條記錄,這和我們期望 2 是相符合的。那么一切正常的情況下,這次單元測試將會通過,那么我們運行看看結果:

單元測試通過了,再查看數(shù)據庫中的記錄:

這說明 mybatis 的 update 更新操作返回值的確是返回受影響的行數(shù)……真的是這樣嗎?

我們知道,當數(shù)據庫中的記錄被修改之后,再次執(zhí)行重復的 update 操作將不會影響到新的行數(shù),為了驗證我說的話,我們試試:

那么,按照這個邏輯:我們再次執(zhí)行這個單元測試應該是, resultCode 返回的應該是 0 ,和我們的期望的數(shù)字 2 不一致,將會導致測試不通過。再次運行單元測試:

居然還是 passed ,看到這里聰明的你已經看出來了, 默認情況下,mybatis 的 update 操作返回值是記錄的 matched 的條數(shù),并不是影響的記錄條數(shù)。 嚴格意義上來將,這并不是 mybatis 的返回值,mybatis 僅僅只是返回的數(shù)據庫連接驅動(通常是 JDBC )的返回值,也就是說,如果驅動告知更新 2 條記錄受影響,那么我們將得到 mybatis 的返回值就會是 2 和 mybatis 本身是沒有關系的。 道理我都懂,如果我們非得要 mybatis 的 update 操作明確的返回受影響的記錄條數(shù),有沒有什么辦法呢? 當然是有的。 通過對 JDBC URL 顯式的指定 useAffectedRows 選項,我們將可以得到受影響的記錄的條數(shù):

解決Mybatis中mapper.xml文件update,delete及insert返回值問題

我們對我們的數(shù)據庫連接配置稍做修改,添加 useAffectedRows 字段:

此時,mybatis 的 update 操作返回的應該是受影響的條數(shù)了,我們再次運行單元測試試試看:

update 操作返回的是受影響的記錄條數(shù),我們知道為 0 和我們預期的 2 不一致,自然而然單元測試不通過。

以上這篇解決Mybatis中mapper.xml文件update,delete及insert返回值問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

主站蜘蛛池模板: 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 颗粒机,颗粒机组,木屑颗粒机-济南劲能机械有限公司 | 锂离子电池厂家-山东中信迪生电源| 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 软启动器-上海能曼电气有限公司| 广东青藤环境科技有限公司-水质检测 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 阁楼货架_阁楼平台_仓库仓储设备_重型货架_广州金铁牛货架厂 | 微动开关厂家-东莞市德沃电子科技有限公司 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 聚合氯化铝厂家-聚合氯化铝铁价格-河南洁康环保科技 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 广东护栏厂家-广州护栏网厂家-广东省安麦斯交通设施有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 |