解決mapper.xml中resultType映射類型的問題
mapper.xml中resultType映射類型問題
記錄一下在公司開發(fā)中遇到的問題
在使用 mapper.xml 進行編寫時 resultMap=“String” String竟然引用不進去,在程序中標(biāo)紅,別的mapper中也映射過但是別的就好使,然后重新啟動的時候代碼執(zhí)行報錯
<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>這時需要 在resultType 中引入絕對路徑
<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>代碼也不報錯了也可以正常使用了,第二天繼續(xù)編寫項目時,試了下把 java.lang. 這個路徑刪了他也好使了,但是在同一個mapper中別的SQL想使用String或者Long類型的還需要引入絕對路徑
mybatis Mapper接口映射Mapper.xml代碼分析
我們在使用mybatis時,會用到Mapper接口映射Mapper.xml,具體怎么映射的我們不知道。只知道要這么用,下面我們開始分析mybatis代碼。
在分析具體代碼時,我們有必要先看一下jdk動態(tài)代理。
簡單點說:jdk動態(tài)代理,可以讓我們在不實現(xiàn)接口的情況下,去動態(tài)生成接口的實現(xiàn)。
傳統(tǒng)上我們要去實現(xiàn)接口,都會創(chuàng)建具體的實現(xiàn)類.java, 而jdk動態(tài)代理,可以讓我們不用創(chuàng)建具體的實現(xiàn)類.java,就可以生成接口實現(xiàn)。
代碼如下:
/**
* 代理工具方法,可以為任意接口生成任意實例代理,該方式使用在了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的實現(xiàn)。
執(zhí)行結(jié)果:

可以看到我們已經(jīng)成功生成了UserMapper的實現(xiàn),方法也正常執(zhí)行了。
mybatis正是使用了該特性進行Mapper接口與Mapper.xml進行映射。
mybatis代碼如下:

具體方法映射在mapperProxy的invoke方法中完成。 如下

進而到MapperMethod中,如下:

然后是SqlCommand,如下:

繼續(xù)往下:

statementId就是我們的接口完全限定名加方法名。獲取對應(yīng)的MappedStatement后,進行下一步處理。這里我們肯定會想,這個MappedStatement是怎么生成的,生成就是在解析Mapper.xml時生成的,代碼如下:


上面的id就是namespace+ select,update,delete,insert的id。
從這里也可以看到我們Mapper.xml的namespace必須的是Mapper接口的完全限定名,select,update,delete,insert的id也必須是接口的方法名。否則使用接口去映射時就會報錯。
xml解析完畢后,就調(diào)用如下方法,生成接口的代理類,并將接口中方法上的mybatis注解,生成MappedStatement,代碼如下



總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用java API實現(xiàn)zip遞歸壓縮和解壓文件夾
這篇文章主要介紹了使用java API實現(xiàn)zip遞歸壓縮文件夾及解壓,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Spring Boot jar 啟動時設(shè)置環(huán)境參數(shù)的操作
這篇文章主要介紹了Spring Boot jar 啟動時設(shè)置環(huán)境參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring?Boot?集成JWT實現(xiàn)前后端認(rèn)證的示例代碼
小程序、H5應(yīng)用的快速發(fā)展,使得前后端分離已經(jīng)成為了趨勢,本文主要介紹了Spring?Boot?集成JWT實現(xiàn)前后端認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
SpringBoot項目集成Swagger和swagger-bootstrap-ui及常用注解解讀
這篇文章主要介紹了SpringBoot項目集成Swagger和swagger-bootstrap-ui及常用注解解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
springboot設(shè)置多環(huán)境配置文件
本文介紹了在Spring Boot項目中配置多個環(huán)境(如dev、test、prod)的方法,可以通過創(chuàng)建多個`.yml`文件來實現(xiàn),每個文件對應(yīng)一個環(huán)境,并在`application.yml`中指定激活的配置文件,感興趣的朋友跟隨小編一起看看吧2025-12-12

