解決mapper.xml中resultType映射類型的問(wèn)題
mapper.xml中resultType映射類型問(wèn)題
記錄一下在公司開發(fā)中遇到的問(wèn)題
在使用 mapper.xml 進(jìn)行編寫時(shí) resultMap=“String” String竟然引用不進(jìn)去,在程序中標(biāo)紅,別的mapper中也映射過(guò)但是別的就好使,然后重新啟動(dòng)的時(shí)候代碼執(zhí)行報(bào)錯(cuò)
<select id="queryAreaBy" parameterType="String" resultType="String"> ? ? ? ?select SUM(area) as area from tb_forward_area where ? ? ? ? ? ? ? ? ? ? server_time = #{serverTime} ?and ? ? ? ? ? ? ? ? ? ? region_code like concat('%',#{regionCode},'%') ? ? ? ? ? ? ? ? ? ? and del_flag='0' ? ? </select>
這時(shí)需要 在resultType 中引入絕對(duì)路徑
<select id="queryAreaBy" parameterType="String" resultType="java.lang.String" > ? ? ? ? select SUM(area) as area from tb_forward_area where ? ? ? ? ? ? ? ? ? ? server_time = #{serverTime} ?and ? ? ? ? ? ? ? ? ? ? region_code like concat('%',#{regionCode},'%') ? ? ? ? ? ? ? ? ? ? and del_flag='0' ? ? </select>
代碼也不報(bào)錯(cuò)了也可以正常使用了,第二天繼續(xù)編寫項(xiàng)目時(shí),試了下把 java.lang. 這個(gè)路徑刪了他也好使了,但是在同一個(gè)mapper中別的SQL想使用String或者Long類型的還需要引入絕對(duì)路徑
mybatis Mapper接口映射Mapper.xml代碼分析
我們?cè)谑褂胢ybatis時(shí),會(huì)用到Mapper接口映射Mapper.xml,具體怎么映射的我們不知道。只知道要這么用,下面我們開始分析mybatis代碼。
在分析具體代碼時(shí),我們有必要先看一下jdk動(dòng)態(tài)代理。
簡(jiǎn)單點(diǎn)說(shuō):jdk動(dòng)態(tài)代理,可以讓我們?cè)诓粚?shí)現(xiàn)接口的情況下,去動(dòng)態(tài)生成接口的實(shí)現(xiàn)。
傳統(tǒng)上我們要去實(shí)現(xiàn)接口,都會(huì)創(chuàng)建具體的實(shí)現(xiàn)類.java, 而jdk動(dòng)態(tài)代理,可以讓我們不用創(chuàng)建具體的實(shí)現(xiàn)類.java,就可以生成接口實(shí)現(xiàn)。
代碼如下:
/** * 代理工具方法,可以為任意接口生成任意實(shí)例代理,該方式使用在了mybatis的Mapper接口映射Mapper.xml中,具體在 MapperProxyFactory * @param tClass * @param invocationHandler * @param <T> * @return */ public <T> T test4(Class<T> tClass, InvocationHandler invocationHandler) { T t = (T) Proxy.newProxyInstance(tClass.getClassLoader(), new Class[] {tClass},invocationHandler); return t; } @Test public void test6() { UserMapper userMapper = test4(UserMapper.class, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("查詢所有"); return null; } }); userMapper.getAll(); }
UserMapper為接口,上面的代碼就直接生成了UserMapper的實(shí)現(xiàn)。
執(zhí)行結(jié)果:
可以看到我們已經(jīng)成功生成了UserMapper的實(shí)現(xiàn),方法也正常執(zhí)行了。
mybatis正是使用了該特性進(jìn)行Mapper接口與Mapper.xml進(jìn)行映射。
mybatis代碼如下:
具體方法映射在mapperProxy的invoke方法中完成。 如下
進(jìn)而到MapperMethod中,如下:
然后是SqlCommand,如下:
繼續(xù)往下:
statementId就是我們的接口完全限定名加方法名。獲取對(duì)應(yīng)的MappedStatement后,進(jìn)行下一步處理。這里我們肯定會(huì)想,這個(gè)MappedStatement是怎么生成的,生成就是在解析Mapper.xml時(shí)生成的,代碼如下:
上面的id就是namespace+ select,update,delete,insert的id。
從這里也可以看到我們Mapper.xml的namespace必須的是Mapper接口的完全限定名,select,update,delete,insert的id也必須是接口的方法名。否則使用接口去映射時(shí)就會(huì)報(bào)錯(cuò)。
xml解析完畢后,就調(diào)用如下方法,生成接口的代理類,并將接口中方法上的mybatis注解,生成MappedStatement,代碼如下
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?AOP?后置通知修改響應(yīng)httpstatus方式
這篇文章主要介紹了Spring?AOP?后置通知修改響應(yīng)httpstatus方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach
這篇文章主要介紹了MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10詳解如何在項(xiàng)目中應(yīng)用SpringSecurity權(quán)限控制
本文主要介紹了如何在項(xiàng)目中應(yīng)用SpringSecurity權(quán)限控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Kafka使用Java客戶端進(jìn)行訪問(wèn)的示例代碼
本篇文章主要介紹了Kafka使用Java客戶端進(jìn)行訪問(wèn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09java求100以內(nèi)的素?cái)?shù)示例分享
素?cái)?shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以內(nèi)的素?cái)?shù)示例,需要的朋友可以參考下2014-03-03Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域(儲(chǔ)存節(jié)點(diǎn)含有的信息),一個(gè)是引用域(儲(chǔ)存下一個(gè)節(jié)點(diǎn)或者上一個(gè)節(jié)點(diǎn)的地址),需要的朋友可以參考下2022-01-01