一次mybatis連接查詢遇到的坑實戰(zhàn)記錄
前言
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。本文主要介紹的是mybatis連接查詢遇到的一個坑以及解決方法,下面話不多說了,來一起看看詳細的介紹吧
1、遇到的問題:
通過角色ID獲取role_menu表中對應的菜單id,再通過菜單id獲取菜單項的權(quán)限編碼 , 使用mybatis連接查詢,代碼如下
// SysRoleMapper
// 通過菜單id連接查詢對應的權(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);
//連接查詢對象SysMenuMapper
@Select("select permission_code from sys_menu where id = #{menuID}")
String getPermissionCodeByMenuID(@Param("menuID") Integer menuID);
預想查詢出List,但返回的卻是**List ,而且打印出的sql語句里,也沒有執(zhí)行g(shù)etPermissionCodeByMenuID()**這個方法對應的sql語句。
2、先上結(jié)論:
在使用@Results進行連接查詢的時候,應該使用實體類或Map對象來接受返回值。
由于自己水平有限,在調(diào)試源碼的過程中,沒有找到mybatis具體是如何處理連接查詢的,
個人猜想是mybatis有一個地方可以判斷返回的類型與sql語句的關(guān)系,如果不匹配直接不執(zhí)行這條sql語句,畫了太多時間,先mark下,后續(xù)再繼續(xù)研究。
代碼改為如下,問題解決;
@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語句:

3、mybatis的基本原理:
在過程中,通過調(diào)試源碼,看網(wǎng)上的一些資料,了解了一些mybatis框架和基本原理,這里做一個小的總結(jié):
Mybatis 是在JDBC的基礎上封裝的,提供了方便強大的API,供用戶對數(shù)據(jù)庫操作;
MyBatis的主要成員
- Configuration MyBatis所有的配置信息都保存在Configuration對象之中,配置文件中的大部分配置都會存儲到該類中
- SqlSession 作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互時的會話,完成必要數(shù)據(jù)庫增刪改查功能
- Executor MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負責SQL語句的生成和查詢緩存的維護
- StatementHandler 封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設置參數(shù)等
- ParameterHandler 負責對用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所對應的數(shù)據(jù)類型
- ResultSetHandler 負責將JDBC返回的ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合
- TypeHandler 負責java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型(也可以說是數(shù)據(jù)表列類型)之間的映射和轉(zhuǎn)換
- MappedStatement MappedStatement維護一條<select|update|delete|insert>節(jié)點的封裝
- SqlSource 負責根據(jù)用戶傳遞的parameterObject,動態(tài)地生成SQL語句,將信息封裝到BoundSql對象中,并返回
- BoundSql 表示動態(tài)生成的SQL語句以及相應的參數(shù)信息

MappedStatement對象
我們在XML或mapper文件中定義的sql語句等,會在初始化的時候加載到內(nèi)存中,以Map對象的形式存儲,后續(xù)需要使用的時候,根據(jù)key來獲取
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot接收參數(shù)所有方式總結(jié)
這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-07-07
Springboot 2.x集成kafka 2.2.0的示例代碼
kafka近幾年更新非???,也可以看出kafka在企業(yè)中是用的頻率越來越高。本文主要為大家介紹了Springboot 2.x集成kafka 2.2.0的示例代碼,需要的可以參考一下2022-04-04

