一次mybatis连接查询遇到的坑实战记录

网友投稿 622 2023-03-01

一次mybatis连接查询遇到的坑实战记录

一次mybatis连接查询遇到的坑实战记录

前言

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。本文主要介绍的是mybatis连接查询遇到的一个坑以及解决方法,下面话不多说了,来一起看看详细的介绍吧

1、遇到的问题:

通过角色ID获取role_menu表中对应的菜单id,再通过菜单id获取菜单项的权限编码 , 使用mybatis连接查询,代码如下

// SysRoleMapper

// 通过菜单id连接查询对应的权限编码

@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 getPermissionByUserRole(Integer roleId);

//连接查询对象SysMenuMapper

@Select("select permission_code from sys_menu where id = #{menuID}")

String getPermissionCodeByMenuID(@Param("menuID") Integer menuID);

预想查询出List,但返回的却是**List ,而且打印出的sql语句里,也没有执行getPermissionCodeByMenuID()**这个方法对应的sql语句。

2、先上结论:

在使用@Results进行连接查询的时候,应该使用实体类或Map对象来接受返回值。

由于自己水平有限,在调试源码的过程中,没有找到mybatis具体是如何处理连接查询的,

个人猜想是mybatis有一个地方可以判断返回的类型与sql语句的关系,如果不匹配直接不执行这条sql语句,画了太多时间,先mark下,后续再继续研究。

代码改为如下,问题解决;

@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> getPermissionByUserRole(Integer roleId);

打印的sql语句:

3、mybatis的基本原理:

在过程中,通过调试源码,看网上的一些资料,了解了一些mybatis框架和基本原理,这里做一个小的总结:

Mybatis 是在JDBC的基础上封装的,提供了方便强大的API,供用户对数据库操作;

MyBatis的主要成员

Configuration            MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中

SqlSession               作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能

Executor                    MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

StatementHandler     封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数

ParameterHandler     负责对用户传递的参数转换成JDBC StatementjufBK 所对应的数据类型

ResultSetHandler      负责将JDBC返回的ResultSet结果集对象转换成List类型的集合

TypeHandler             负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换

MappedStatement     MappedStatement维护一条

SqlSource                 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

BoundSql                  表示动态生成的SQL语句以及相应的参数信息

MappedStatement对象

我们在XML或mapper文件中定义的sql语句等,会在初始化的时候加载到内存中,以Map对象的形式存储,后续需要使用的时候,根据key来获取

key = "com.project.mapper.SysRoleMapper.getRole"

value = {MappedStatement@11731}

.....

参考:https://blog.csdn-/luanlouis/article/details/40422941

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue开发小程序步骤(如何用vue开发微信小程序)
下一篇:怎么关闭微信小程序插件(怎么关闭微信小程序插件提示)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~