日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

前言

在初入門(mén)Mybatis的時(shí)候可能都犯過(guò)一個(gè)錯(cuò)誤,那就是在寫(xiě)Mapper接口的時(shí)候都重載過(guò)其中的方法,但是運(yùn)行起來(lái)總是報(bào)錯(cuò),那時(shí)候真的挺郁悶的,但是自己也查不出來(lái)原因,只能默默的改了方法名,哈哈,多么卑微的操作。

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

環(huán)境配置

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

錯(cuò)誤示范

舉個(gè)栗子:假設(shè)現(xiàn)在有兩個(gè)需求,一個(gè)是根據(jù)用戶(hù)的id篩選用戶(hù),一個(gè)是根據(jù)用戶(hù)的性別篩選,此時(shí)在Mapper中重載的方法如下:

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

這個(gè)并沒(méi)有什么錯(cuò)誤,但是啟動(dòng)項(xiàng)目,報(bào)出如下的錯(cuò)誤:

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這個(gè)id已經(jīng)存在了,導(dǎo)致創(chuàng)建sqlSessionFactory失敗。

為什么不能重載?

通過(guò)上面的異常提示可以知道創(chuàng)建sqlSessionFactory失敗了,這個(gè)想必已經(jīng)不陌生吧,顧名思義,就是創(chuàng)建SqlSession的工廠(chǎng)。 Springboot與Mybatis會(huì)有一個(gè)啟動(dòng)器的自動(dòng)配置類(lèi)MybatisAutoConfiguration,其中有一段代碼就是創(chuàng)建sqlSessionFactory,如下圖:

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

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

解析XML文件和Mapper接口,將Mapper中的方法與XML文件中<select>、<insert>等標(biāo)簽一一對(duì)應(yīng),那么Mapper中的方法如何與XML中<select>這些標(biāo)簽對(duì)應(yīng)了,當(dāng)然是唯一的id對(duì)應(yīng)了,具體如何這個(gè)id的值是什么,如何對(duì)應(yīng)?下面一一講解。

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

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

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

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

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

此處就是根據(jù)XML文件中的select|insert|update|delete這些標(biāo)簽開(kāi)始構(gòu)建MappedStatement了。繼續(xù)跟進(jìn)去看。

略過(guò)不重要的代碼,此時(shí)看到org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement這個(gè)方法返回值就是MappedStatement,不用多說(shuō),肯定是這個(gè)方法了,仔細(xì)一看,很清楚的看到了構(gòu)建id的代碼,如下圖:

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

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

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

上圖的代碼已經(jīng)很清楚了,MappedStatement中的id=Mapper的全類(lèi)名+’.’+方法名。如果重載話(huà),肯定會(huì)存在id相同的MappedStatement。

到了這其實(shí)并不能說(shuō)明方法不能重載啊,重復(fù)就重復(fù)唄,并沒(méi)有沖突啊。這里需要看一個(gè)結(jié)構(gòu),如下:

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

構(gòu)建好的MappedStatement都會(huì)存入mappedStatements中,如下代碼:

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

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

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

到了這里應(yīng)該理解了吧,這下拋出的異常和上面的異常信息對(duì)應(yīng)起來(lái)了吧。這個(gè)StrictMap不允許有重復(fù)的key,而存入的key就是id。因此Mapper中的方法不能重載。

如何找到XML中對(duì)應(yīng)的SQL?

在使用Mybatis的時(shí)候只是簡(jiǎn)單的調(diào)用Mapper中的方法就可以執(zhí)行SQL,如下代碼:

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

一行簡(jiǎn)單的調(diào)用到底如何找到對(duì)應(yīng)的SQL呢?其實(shí)就是根據(jù)id從Map<String, MappedStatement> mappedStatements中查找對(duì)應(yīng)的MappedStatement。

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

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

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

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

總結(jié)

文章寫(xiě)到這,想必已經(jīng)很清楚Mapper中的方法為什么不能重載了,歸根到底就是因?yàn)檫@個(gè)這個(gè)id=Mapper的全類(lèi)名+’.’+方法名。

到此這篇關(guān)于Mybatis的Mapper中的方法為什么不能重載的文章就介紹到這了,更多相關(guān)Mybatis Mapper重載內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品1区| 一区福利视频| 日韩精品一级| 爽好久久久欧美精品| 亚洲一区二区三区四区电影| 欧美成人精品| 91国语精品自产拍| 波多野结衣一区| 99日韩精品| 精品一区二区三区中文字幕视频 | 麻豆精品国产91久久久久久| 亚洲影视一区| 久久精品亚洲| 久久精品中文| 综合激情网...| 亚洲久久视频| 国产一区二区精品福利地址| 欧洲一区二区三区精品| 亚洲女人av| 国产亚洲久久| 欧美羞羞视频| 亚洲欧美激情诱惑| 日韩精品一区二区三区中文在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 乱人伦精品视频在线观看| 亚州欧美在线| 欧美久久天堂| 最新国产精品| 免费污视频在线一区| 亚洲精品第一| 亚洲第一精品影视| 欧美亚洲网站| 好吊日精品视频| 国产丝袜一区| 亚洲精品中文字幕乱码| 97久久超碰| 久久久久久久久久久9不雅视频| 日av在线不卡| 国产成人a视频高清在线观看| 一本色道久久精品| 青草av.久久免费一区| 美女视频一区在线观看| 亚洲欧美日韩高清在线| 三上亚洲一区二区| 日韩成人午夜精品| 99久久精品网| 婷婷综合亚洲| 水蜜桃精品av一区二区| 欧美日韩一区二区三区不卡视频 | 色婷婷亚洲mv天堂mv在影片| 亚洲精品动态| 日韩精品欧美| 国产66精品| 国产激情精品一区二区三区| 快she精品国产999| 免费在线观看一区二区三区| 亚洲成人免费| 婷婷综合在线| 不卡在线一区二区| 尤物tv在线精品| 9色精品在线| 日本中文字幕一区二区| 性欧美69xoxoxoxo| 欧美天堂一区| 精品国产一区二区三区av片| 蜜桃av一区二区| 久久久久久久欧美精品| 日欧美一区二区| 国产麻豆一区二区三区| 国产一区二区精品久| 免费在线视频一区| 久久免费影院| 麻豆视频一区二区| 久久久精品久久久久久96| 巨乳诱惑日韩免费av| 婷婷视频一区二区三区| 中文字幕av一区二区三区四区| 亚洲天堂日韩在线| 欧美a级一区二区| 欧洲一区二区三区精品| 欧美中文一区二区| 欧美亚洲在线日韩| 综合日韩在线| 久久久久久色 | 欧美一级精品| 国产精品老牛| 国产精品日韩精品在线播放| 日韩欧美一区二区三区免费看| 神马午夜在线视频| 亚洲精品欧洲| 亚洲特级毛片| 国产精品第一| 先锋影音国产一区| 国产一区丝袜| 免费日韩精品中文字幕视频在线| 麻豆国产精品777777在线| 黄色国产精品| 精品国产美女a久久9999| 亚洲欧美日韩一区在线观看| 国产精品高清一区二区| 精品一区二区三区免费看| 日韩精品导航| 日本成人中文字幕| 美女av在线免费看| 欧美激情91| 麻豆精品在线视频| 日韩av电影一区| 视频在线观看91| 免费成人在线影院| 亚洲第一区色| 超碰在线99| 久久久久久色| 国产激情欧美| 国产福利资源一区| 你懂的国产精品| 久久在线91| 免费福利视频一区二区三区| 国产精品久久久久久久久妇女| 久久激情五月激情| 开心激情综合| 久草精品视频| 精品久久久久中文字幕小说| 日韩欧美1区| 日韩精品电影| 91嫩草亚洲精品| 中文在线中文资源| 四虎影视精品| 蜜臀va亚洲va欧美va天堂| 国产日韩欧美一区二区三区在线观看| 欧美中文高清| 国产96在线亚洲| 一区在线免费观看| 青青青国产精品| 国产丝袜一区| 欧美日中文字幕| 国产亚洲第一伦理第一区| 亚洲精品国产嫩草在线观看| 欧美日韩激情| 日韩国产欧美在线视频| 91视频一区| 日韩中文字幕一区二区高清99| 一区福利视频| 成人在线视频中文字幕| 天堂网av成人| 91国内精品| 99国产精品99久久久久久粉嫩| 国产精品一区二区免费福利视频| 国产精品二区不卡| 久久国产三级| 免费观看亚洲| 国产精品久久观看| 精品一区二区三区中文字幕视频| 男女男精品网站| 免费观看在线综合| 美国三级日本三级久久99| 99成人在线| 综合一区在线| 91免费精品国偷自产在线在线| 最新国产精品视频| 99热精品在线| 亚洲aa在线| 亚洲2区在线| 在线日韩av| 国产精品三级| 日韩在线短视频| 一区二区三区四区在线观看国产日韩| 免费在线成人| 欧美精品影院| 日韩在线一区二区| 欧美日韩国产一区二区三区不卡| 欧美国产不卡| 国产乱人伦精品一区| 亚洲三级在线| 亚洲免费毛片| 亚洲激情国产| 91精品国产成人观看| 国产精品亚洲欧美日韩一区在线| 久久九九99| 成人国产综合| 精品一区二区三区中文字幕视频 | 99久久精品费精品国产| 欧美精品三级在线| 一区在线免费| 欧美va天堂在线| 激情亚洲影院在线观看| 日韩精品福利一区二区三区| 国产精品日韩| 蜜臀av在线播放一区二区三区| 中文一区一区三区免费在线观 | 日韩黄色大片网站| 久久亚洲国产| 天使萌一区二区三区免费观看| 日本成人精品| 国产精品不卡| 日韩视频久久| 日韩精彩视频在线观看| 国产成人调教视频在线观看| 欧美亚洲国产精品久久| 欧美大黑bbbbbbbbb在线| 亚洲精品日韩久久|