环境描述:

我在使用SSM做项目的时候需要一个需求:一个用户有多个角色,一个角色有多个权限,我需要根据用户的id找到用户的所有角色,及其对应的权限。

数据库是这个样子,users_role表记录了用户和角色的关系,role_permission表记录了角色和权限的对应关系。

DAO层是这样设计的

/**
* 角色Dao
*/
public interface IRoleDao { /**
* 根据用户id查询出所有对应的角色
* @param userId 用户id
* @return 用户所有的角色信息
* @throws Exception
*/
@Select("SELECT role.* FROM role,users_role WHERE role.id = users_role.roleId AND users_role.userId = #{userId}")
@Results({
@Result(id = true, property = "id" , column = "id"),
@Result(property = "permissions", column = "id" , many = @Many(select = "com.zjw.dao.IPermissionDao.findPermissionByRoleId "))
})
List<Role> findRoleByUserId(String userId) throws Exception;
}
/**
* 权限Dao
*/
public interface IPermissionDao { /**
* 根据角色id查找所对应的权限
* @param id 角色id
* @return 角色id对应的权限列表
* @throws Exception
*/
@Select("select permission.* from permission where id in (select permissionId from role_permission where roleId=#{id})")
List<Permission> findPermissionByRoleId(String id) throws Exception;
}

看起来一切ok。

但是在项目跑起来以后。。。。。

这不就尴尬了吗???

报错的大概的意思的它找不到需要执行的sql语句了。

但是执行sql的方法我写了呀。。

世上最痛苦的事莫过于,我告诉了你她在哪,你给我说你是直男。 ——mybatis

案情分析

案情紧急,刻不容缓。

我怀疑

是我JavaBean写错了,与数据库字段不对应? 发现不是。

是我没有重新clean项目,新的代码没有打包上?试了也不行。

我@Result需要写个JavaType?发现也不用啊。

是我测试类有影响?删了也不行啊。

需要重启IDEA?没用。

我的sql语句有问题?在数据库中查了一下,可以查询啊。

出现转机

我仔仔细细盯着几行简单的代码。。。。。

我。。。。。

突然。

发现。

这里是不是多个空格???,影响执行吗? 不管了,删了空格再说。

clean,install,run,访问。

报错消失了。。。。我。。。下楼取快递去。。。。。

总结:

不是我的错,是mybatis的锅,你是一个成熟的框架了,去空格这种事情还要我教你吗?

mybatis—— 一个空格引发的血案的更多相关文章

  1. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  2. Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  3. 一个字母引发的血案 java.io.File中mkdir()和mkdirs()

    一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...

  4. SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)

    查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...

  5. 一个空格引发的bug

    好久没写博客了. 我们的一个项目用的thinkphp框架,当在debug模式下面运行很正常,但切换到生产模式时,刷新页面第一次可以正常显示,刷新第二次会出现错误如下: Fatal error: Cal ...

  6. Gson-记录一个空格引发的json血案

    使用的Gson将json自动装载到Bean,一般情况下,用起来又快又稳. 直到有一天,测试告诉我说,填写地址时,地址里有空格,就会500异常. 我把异常截取出来: Type Exception Rep ...

  7. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  8. 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程

    在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...

  9. 一个NULL引发的血案

    go sql.stmt query 发生了一个NULL值,所以发现了error, 发现服务不停的初始化sql stmt, 导致连接数过多,服务就变得很慢. 首先,我在初始化的之前,要判断这个是否是NU ...

  10. String属于“假引用类型”,代码为证(一个String引发的血案...)

    一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...

随机推荐

  1. 面试官:你是如何进行SQL调优的?

    SQL调优是我们后端开发人员面试中的高频考点,也是实际工作中提升数据库性能的关键技能.面对"你是如何进行SQL调优的?"这个问题,你是否能条理清晰地分析问题并提供解决方案? 1. ...

  2. 如何测试网络是否支持ipv6地址?如何打开ipv6?

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 一.什么是IPv6: 1.IPv6简介: IPv6是 ...

  3. 执行shell脚本报错:Syntax error: word unexpected (expecting "in")

    检查语法无误后,考虑是脚本文件换行符的问题. vs创建的文件默认以CRLF(0D0A)换行. 然而对于换行,windows用CRLF(0D0A)表示,linux用LF(0A)表示. 切换脚本文件换行符 ...

  4. 使用mybatis-plus转换枚举值

    1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致性 缺点:如果有大量 ...

  5. Elasticsearch搜索引擎学习笔记(二)

    可视化插件 GitHub搜索elasticsearch-head并下载,如果网络不好可以在gitee上搜索. 这是一个前端项目,需要安装nodejs. 在项目根目录执行 npm install npm ...

  6. Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

    在众多开源项目中,高颜值.功能强大且部署简单的项目往往更能俘获开发者的心.然而,实际部署 Web 应用时,面对数据库.缓存.消息队列等复杂的依赖关系,常常令人头疼.Docker 的开源为我们普及了容器 ...

  7. wxpython SetValue 获取列表数据获取不到

    self.m_textCtrl4.SetValue(files) 同样的方法获取其他值就获取到了 ,后来想了想files是列表数据,于是将类型变为str型成功 self.m_textCtrl4.Set ...

  8. 『Plotly实战指南』--架构与设计理念

    在数据科学和数据分析领域,数据可视化是理解数据和传达信息的关键环节. Python 作为最受欢迎的编程语言之一,拥有众多强大的可视化库,而 Plotly 无疑是其中的佼佼者. 本文将深入介绍 Plot ...

  9. libvirt和qga的区别?

    本文分享自天翼云开发者社区<libvirt和qga的区别?>,作者:乐道 Libvirt是一个开源项目,提供了一组API.工具.库,用于管理和控制虚拟化平台. 在Openstack环境中, ...

  10. JMeter 线程编号 __threadNum 获取不到

    场景: 在 BeanShell PreProcessor 中,使用 vars.get("__threadNum") 获取不到当前线程数,如: import org.apache.j ...