mybatis—— 一个空格引发的血案

环境描述:

我在使用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的锅,你是一个成熟的框架了,去空格这种事情还要我教你吗?

--------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
原文地址:https://www.cnblogs.com/zjw-blog/p/13987061.html