一次mybatis連接查詢遇到的坑實(shí)戰(zhàn)記錄
前言
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。本文主要介紹的是mybatis連接查詢遇到的一個(gè)坑以及解決方法,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
1、遇到的問(wèn)題:
通過(guò)角色I(xiàn)D獲取role_menu表中對(duì)應(yīng)的菜單id,再通過(guò)菜單id獲取菜單項(xiàng)的權(quán)限編碼 , 使用mybatis連接查詢,代碼如下
// SysRoleMapper // 通過(guò)菜單id連接查詢對(duì)應(yīng)的權(quán)限編碼 @Select("select menu_id from sys_role_menu where role_id = #{roleId}") @Results({ @Result(column = "menu_id",property = "permissionCode", one = @One(select = "com.project.system.mapper.SysMenuMapper.getPermissionCodeByMenuID")) }) List<String> getPermissionByUserRole(Integer roleId); //連接查詢對(duì)象SysMenuMapper @Select("select permission_code from sys_menu where id = #{menuID}") String getPermissionCodeByMenuID(@Param("menuID") Integer menuID);
預(yù)想查詢出List,但返回的卻是**List ,而且打印出的sql語(yǔ)句里,也沒(méi)有執(zhí)行g(shù)etPermissionCodeByMenuID()**這個(gè)方法對(duì)應(yīng)的sql語(yǔ)句。
2、先上結(jié)論:
在使用@Results進(jìn)行連接查詢的時(shí)候,應(yīng)該使用實(shí)體類或Map對(duì)象來(lái)接受返回值。
由于自己水平有限,在調(diào)試源碼的過(guò)程中,沒(méi)有找到mybatis具體是如何處理連接查詢的,
個(gè)人猜想是mybatis有一個(gè)地方可以判斷返回的類型與sql語(yǔ)句的關(guān)系,如果不匹配直接不執(zhí)行這條sql語(yǔ)句,畫了太多時(shí)間,先mark下,后續(xù)再繼續(xù)研究。
代碼改為如下,問(wèn)題解決;
@Select("select menu_id from sys_role_menu where role_id = #{roleId}") @Results({ @Result(column = "menu_id",property = "permissionCode", one = @One(select = "com.project.system.mapper.SysMenuMapper.getPermissionCodeByMenuID")) }) List<Map<String,String>> getPermissionByUserRole(Integer roleId);
打印的sql語(yǔ)句:
3、mybatis的基本原理:
在過(guò)程中,通過(guò)調(diào)試源碼,看網(wǎng)上的一些資料,了解了一些mybatis框架和基本原理,這里做一個(gè)小的總結(jié):
Mybatis 是在JDBC的基礎(chǔ)上封裝的,提供了方便強(qiáng)大的API,供用戶對(duì)數(shù)據(jù)庫(kù)操作;
MyBatis的主要成員
- Configuration MyBatis所有的配置信息都保存在Configuration對(duì)象之中,配置文件中的大部分配置都會(huì)存儲(chǔ)到該類中
- SqlSession 作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫(kù)交互時(shí)的會(huì)話,完成必要數(shù)據(jù)庫(kù)增刪改查功能
- Executor MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語(yǔ)句的生成和查詢緩存的維護(hù)
- StatementHandler 封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBC statement 的操作,如設(shè)置參數(shù)等
- ParameterHandler 負(fù)責(zé)對(duì)用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所對(duì)應(yīng)的數(shù)據(jù)類型
- ResultSetHandler 負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類型的集合
- TypeHandler 負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型(也可以說(shuō)是數(shù)據(jù)表列類型)之間的映射和轉(zhuǎn)換
- MappedStatement MappedStatement維護(hù)一條<select|update|delete|insert>節(jié)點(diǎn)的封裝
- SqlSource 負(fù)責(zé)根據(jù)用戶傳遞的parameterObject,動(dòng)態(tài)地生成SQL語(yǔ)句,將信息封裝到BoundSql對(duì)象中,并返回
- BoundSql 表示動(dòng)態(tài)生成的SQL語(yǔ)句以及相應(yīng)的參數(shù)信息
MappedStatement對(duì)象
我們?cè)赬ML或mapper文件中定義的sql語(yǔ)句等,會(huì)在初始化的時(shí)候加載到內(nèi)存中,以Map對(duì)象的形式存儲(chǔ),后續(xù)需要使用的時(shí)候,根據(jù)key來(lái)獲取
key = "com.project.mapper.SysRoleMapper.getRole" value = {MappedStatement@11731} .....
參考:https://blog.csdn.net/luanlouis/article/details/40422941
總結(jié)
到此這篇關(guān)于mybatis連接查詢遇到的坑的文章就介紹到這了,更多相關(guān)mybatis連接查詢的坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java SpringBoot開(kāi)發(fā)小技巧詳解
這篇文章主要介紹了淺談SpringBoot項(xiàng)目如何讓前端開(kāi)發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開(kāi)發(fā)的應(yīng)用詳解
這篇文章主要介紹了SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開(kāi)發(fā)的應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01IntelliJ IDEA安裝目錄和設(shè)置目錄的說(shuō)明(IntelliJ IDEA快速入門)
這篇文章主要介紹了IntelliJ IDEA安裝目錄和設(shè)置目錄的說(shuō)明(IntelliJ IDEA快速入門),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04InteliJ IDEA 設(shè)置eclipse快捷鍵 的圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了InteliJ IDEA 設(shè)置eclipse快捷鍵 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下2018-06-06Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能,結(jié)合實(shí)例形式分析了Java二維數(shù)組的遍歷、運(yùn)算、賦值等實(shí)現(xiàn)轉(zhuǎn)置的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01SpringMVC的注解@RequestMapping屬性及使用
這篇文章主要為大家介紹了SpringMVC注解@RequestMapping屬性及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05解決springboot集成rocketmq關(guān)于tag的坑
這篇文章主要介紹了解決springboot集成rocketmq關(guān)于tag的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08