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

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

Mybatis的Mapper中的方法為什么不能重載

瀏覽:7日期:2023-10-22 17:11:00

前言

在初入門Mybatis的時候可能都犯過一個錯誤,那就是在寫Mapper接口的時候都重載過其中的方法,但是運行起來總是報錯,那時候真的挺郁悶的,但是自己也查不出來原因,只能默默的改了方法名,哈哈,多么卑微的操作。

今天就寫一篇文章從源碼角度為大家解惑為什么Mybatis中的方法不能重載?

環境配置

本篇文章講的一切內容都是基于Mybatis3.5和SpringBoot-2.3.3.RELEASE。

錯誤示范

舉個栗子:假設現在有兩個需求,一個是根據用戶的id篩選用戶,一個是根據用戶的性別篩選,此時在Mapper中重載的方法如下:

public interface UserMapper { List<UserInfo> selectList(@Param('userIds') List<String> userIds); List<UserInfo> selectList(Integer gender); }

這個并沒有什么錯誤,但是啟動項目,報出如下的錯誤:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ’sqlSessionFactory’ defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method ’sqlSessionFactory’ threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: ’file [H:work_projectdemotargetclassesmapperUserInfoMapper.xml]’; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is ’file [H:work_projectdemotargetclassesmapperUserInfoMapper.xml]’. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for cn.cb.demo.dao.UserMapper.selectList. please check file [H:work_projectdemotargetclassesmapperUserInfoMapper.xml] and file [H:work_projectdemotargetclassesmapperUserInfoMapper.xml]at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655)at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1307)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1509)... 81 more

這么一大串什么意思?懵逼了~

大致的意思:cn.cb.demo.dao.UserMapper.selectList這個id已經存在了,導致創建sqlSessionFactory失敗。

為什么不能重載?

通過上面的異常提示可以知道創建sqlSessionFactory失敗了,這個想必已經不陌生吧,顧名思義,就是創建SqlSession的工廠。 Springboot與Mybatis會有一個啟動器的自動配置類MybatisAutoConfiguration,其中有一段代碼就是創建sqlSessionFactory,如下圖:

Mybatis的Mapper中的方法為什么不能重載

既然是創建失敗,那么肯定是這里出現異常了,這里的「大致思路」就是:

解析XML文件和Mapper接口,將Mapper中的方法與XML文件中<select>、<insert>等標簽一一對應,那么Mapper中的方法如何與XML中<select>這些標簽對應了,當然是唯一的id對應了,具體如何這個id的值是什么,如何對應?下面一一講解。

如上圖的SqlSessionFactory的創建過程中,前面的部分代碼都是設置一些配置,并沒有涉及到解析XML的內容,因此答案肯定是在最后一行return factory.getObject();,于是此處打上斷點,一點點看。于是一直到了org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory這個方法中,其中一段代碼如下:

Mybatis的Mapper中的方法為什么不能重載

這里的xmlMapperBuilder.parse();就是解析XML文件與Mapper接口,繼續向下看。

略過不重要的代碼,在org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement這個方法中有一行重要的代碼,如下圖:

Mybatis的Mapper中的方法為什么不能重載

此處就是根據XML文件中的select|insert|update|delete這些標簽開始構建MappedStatement了。繼續跟進去看。

略過不重要的代碼,此時看到org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement這個方法返回值就是MappedStatement,不用多說,肯定是這個方法了,仔細一看,很清楚的看到了構建id的代碼,如下圖:

Mybatis的Mapper中的方法為什么不能重載

從上圖可以知道,創建id的代碼就是id = applyCurrentNamespace(id, false);,具體實現如下圖:

Mybatis的Mapper中的方法為什么不能重載

上圖的代碼已經很清楚了,MappedStatement中的id=Mapper的全類名+’.’+方法名。如果重載話,肯定會存在id相同的MappedStatement。

到了這其實并不能說明方法不能重載啊,重復就重復唄,并沒有沖突啊。這里需要看一個結構,如下:

protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>('Mapped Statements collection') .conflictMessageProducer((savedValue, targetValue) -> '. please check ' + savedValue.getResource() + ' and ' + targetValue.getResource());

構建好的MappedStatement都會存入mappedStatements中,如下代碼:

public void addMappedStatement(MappedStatement ms) { //key 是id mappedStatements.put(ms.getId(), ms); }

StrictMap的put(k,v)方法如下圖:

Mybatis的Mapper中的方法為什么不能重載

到了這里應該理解了吧,這下拋出的異常和上面的異常信息對應起來了吧。這個StrictMap不允許有重復的key,而存入的key就是id。因此Mapper中的方法不能重載。

如何找到XML中對應的SQL?

在使用Mybatis的時候只是簡單的調用Mapper中的方法就可以執行SQL,如下代碼:

List<UserInfo> userInfos = userMapper.selectList(Arrays.asList('192','198'));

一行簡單的調用到底如何找到對應的SQL呢?其實就是根據id從Map<String, MappedStatement> mappedStatements中查找對應的MappedStatement。

在org.apache.ibatis.session.defaults.DefaultSqlSession#selectList方法有這一行代碼如下圖:

Mybatis的Mapper中的方法為什么不能重載MappedStatement

ms = configuration.getMappedStatement(statement);這行代碼就是根據id從mappedStatements獲取對應的MappedStatement,源碼如下:

public MappedStatement getMappedStatement(String id) { return this.getMappedStatement(id, true); }

總結

文章寫到這,想必已經很清楚Mapper中的方法為什么不能重載了,歸根到底就是因為這個這個id=Mapper的全類名+’.’+方法名。

到此這篇關于Mybatis的Mapper中的方法為什么不能重載的文章就介紹到這了,更多相關Mybatis Mapper重載內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | AR开发公司_AR增强现实_AR工业_AR巡检|上海集英科技 | 湖南自考_湖南自学考试 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 智慧钢琴-电钢琴-便携钢琴-数码钢琴-深圳市特伦斯乐器有限公司 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 |