一次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连接查询的坑内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java的MyBatis框架中实现多表连接查询和查询结果分页

    实现多表联合查询 还是在david.mybatis.model包下面新建一个Website类,用来持久化数据之用,重写下相应toString()方法,方便测试程序之用. package david.mybatis.model; import java.text.SimpleDateFormat; import java.util.Date; public class Website { private int id; private String name; private int visito

  • mybatis同一张表多次连接查询相同列赋值问题小结

    最近遇到的一些问题总结: 1. MySQL数据库同一张表做四次左连接查询数据冗余. a. mysql数据库连接查询 b. mysql表数据去重 2. mybatis查询相同列赋值重复问题. a. 使用mybatis强大的resultMap b. mysql数据查询别名 数据库表为 Create Table CREATE TABLE `STUDENT_SCORE` ( `score_id` int(11) unsigned NOT NULL AUTO_INCREMENT,//主键 `test_id

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

    前言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.本文主要介绍的是mybatis连接查询遇到的一个坑以及解决方法,下面话不多说了,来一起看看详细的介绍吧 1.遇到的问题: 通过角色ID获取role_menu表中对应的菜单id,再通过菜单id获取菜单项的权限编码 , 使用mybatis连接查询,代码如下 // SysRoleMapper // 通过菜单id连接查询对应的权限编码 @Select("select menu_id from sys_role_me

  • 使用Pyinstaller的最新踩坑实战记录

    前言 将py编译成可执行文件需要使用PyInstaller,之前给大家介绍了关于利用PyInstaller将python程序.py转为.exe的方法,在开始本文之前推荐大家可以先看下这篇文章,本文主要给大家介绍了Pyinstaller最新踩坑实战记录,现在网上关于pyinstaller的问题充斥着各种copy过来copy过去的答案,这大概就是各种无脑博客爬虫站最让人讨厌的地方. 而且这方面的问题,stackoverflow也是回答的千奇百怪. 强烈推荐官方文档 http://pythonhost

  • Go使用proto3的踩坑实战记录

    开发环境:windows10,golang1.18.2,goland2022.2 最近在写项目时,一些数据类的结构以protobuf文件给定.因此,需要将这些protobuf文件转换为golang代码. 首先,在下载解析protobuf的包的时候就碰到了第一个问题... go get -u github.com/golang/protobuf/protoc-gen-go 在我用上述命令后,终端提示该包已弃用 go: module github.com/golang/protobuf is dep

  • 一次mysql迁移的方案与踩坑实战记录

    目录 背景 方案一:老数据备份 方案二:分表 方案三:迁移至tidb 重点说下同步老数据遇到的坑 最终同步脚本方案 总结 背景 由于历史业务数据采用mysql来存储的,其中有一张操作记录表video_log,每当用户创建.更新或者审核人员审核的时候,对应的video_log就会加一条日志,这个log表只有insert,可想而知,1个video对应多条log,一天10w video,平均统计一个video对应5条log,那么一天50w的log, 一个月50 * 30 = 1500w条记录, 一年就

  • nginx反向代理踩坑实战记录(容器方式)

    目录 一.简述 1.1 什么是反向代理? 1.2 看图理解 1.3 错误总结 二.正确案例 2.1 启动nginx 2.3 配置nginx 2.4 重启所有服务 2.5 测试 三.云服务器上跑的nginx怎么代理本地项目 总结 一.简述 1.1 什么是反向代理? 这很重要,反向代理就是代理服务器代理真实服务器.客户端以为代理服务器就是真实服务器,所以就会把要请求的==资源(URL)==发给代理服务器. 代理服务器一般是由nginx来充当,代理功能由配置文件来完成. 1.2 看图理解 画的仓促,大

  • Java中BigDecimal与0比较的一个坑实战记录

    目录 前言 问题解决 问题讲解 附:Java BigDecimal中一些其他的坑 总结 前言 在之前做的一个项目中,为了保证BigDecimal在除数 divide时,如果被除数为0,出现java.lang.ArithmeticException: / by zero 报错问题,写了一个对比.具体代码如下: public static BigDecimal getScale(BigDecimal data1,BigDecimal data2,Integer scale){ if(Objects.

  • springboot整合log4j的踩坑实战记录

    目录 1.依赖添加 1.1.添加依赖 1.2.剔除依赖 2.配置日志 2.1.日志打印记录 2.2.指定配置文件 补充:log4j调优和注意事项 总结 1.依赖添加 1.1.添加依赖 需要引入 log4j 的依赖支持,推荐自己确定使用的版本. <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <ve

  • vue3搭配pinia的踩坑实战记录

    目录 前言 An Object could not be cloned? VUE 3的toRaw PINIA与VUE 3可以混合搭配? 同样的操作在VUE 3下的结果 最后的解决方式 总结 前言 最近接手了一个新项目,用的是VUE3+pinia的组合.由于之前没有用过这2个库,只能现学现做.幸运的是这两者的上手难度都不大,项目可以正常开发.但这其中也遇到了一些坑,今天就来讲其中我印象最深的一个. An Object could not be cloned? 不知道有多少开发者遇到过这个报错——A

  • Android录音功能的实现以及踩坑实战记录

    目录 前言 前提 : 代码实现流程 : 踩坑 1.Android Q: 2.RuntimeException:setAudioSource failed 3.MediaRecorder: stop failed 总结 前言 最近接到个需求,不使用第三方SDK的情况下实现IM通讯,文字聊天已经通过MQTT实现,而语音功能目前想到的较好解决方案就是进行录音文件的上传下载.可能还有更好解决方案,但我目前没想到,有建议的小伙伴劳烦指导下. 前提 : 1.权限申请: 清单文件中加上: <uses-perm

  • Java切割字符串的踩坑实战记录

    目录 坑出现的环境 问题的解决 补充:java分割字符串常见语法 一.java.lang.String.split() 二.java.util.StringTokenizer() 总结 坑出现的环境 一般情况下切割字符串会使用split或者StringTokenizer,如下代码 String s = ",,o,,"; String[] split = s.split(","); 期望得到数组["","","o&qu

随机推荐