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

 更新时间:2020年12月09日 14:35:31   作者:Nicander  
这篇文章主要给大家介绍了关于一次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<String> 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<Map<String,String>> 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 Statement 所对应的数据类型
  • ResultSetHandler      负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
  • TypeHandler             负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
  • MappedStatement     MappedStatement维护一条<select|update|delete|insert>节点的封装
  • SqlSource                 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql                  表示动态生成的SQL语句以及相应的参数信息

MappedStatement对象

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

 key = "com.project.mapper.SysRoleMapper.getRole"
 value = {MappedStatement@11731} 
.....

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

总结

到此这篇关于mybatis连接查询遇到的坑的文章就介绍到这了,更多相关mybatis连接查询的坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java selenium上传文件的实现

    Java selenium上传文件的实现

    本文主要介绍了Java selenium上传文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 通过RedisTemplate连接多个Redis过程解析

    通过RedisTemplate连接多个Redis过程解析

    这篇文章主要介绍了通过RedisTemplate连接多个Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • JVM调优参数的设置

    JVM调优参数的设置

    Java虚拟机的调优是一个复杂而关键的任务,可以通过多种参数来实现,本文就来介绍一下JVM调优参数的设置,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 微信小程序录音文件格式silk遇到的问题及解决方法

    微信小程序录音文件格式silk遇到的问题及解决方法

    录音文件为silk格式,说是silk其实是base64加密后的webm格式,只需将其转为webm格式即可。但是在处理过程中遇到各种坑,下面小编给大家带来了微信小程序录音文件格式silk遇到的问题及解决方法,感兴趣的朋友一起看看吧
    2018-09-09
  • SpringBoot接收参数所有方式总结

    SpringBoot接收参数所有方式总结

    这篇文章主要介绍了SpringBoot接收参数所有方式总结,文中通过代码示例和图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • java实现折半排序算法

    java实现折半排序算法

    折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态。
    2015-04-04
  • 详细易懂带你了解Spring中的注解

    详细易懂带你了解Spring中的注解

    这篇文章主要介绍了详细易懂带你了解Spring中的注解,Spring的一个核心是IOC,是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式,需要的朋友可以参考下
    2023-08-08
  • Springboot 2.x集成kafka 2.2.0的示例代码

    Springboot 2.x集成kafka 2.2.0的示例代码

    kafka近几年更新非常快,也可以看出kafka在企业中是用的频率越来越高。本文主要为大家介绍了Springboot 2.x集成kafka 2.2.0的示例代码,需要的可以参考一下
    2022-04-04
  • IDEA2020配置Git的方法步骤

    IDEA2020配置Git的方法步骤

    这篇文章主要介绍了IDEA2020配置Git的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 排序算法的Java实现全攻略

    排序算法的Java实现全攻略

    这篇文章主要介绍了排序算法的Java实现,包括Collections.sort()的使用以及各种经典算法的Java代码实现方法总结,超级推荐!需要的朋友可以参考下
    2015-08-08

最新评论