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的锅,你是一个成熟的框架了,去空格这种事情还要我教你吗?
---------------
我每一次回头,都感觉自己不够努力,所以我不再回头。
---------------