mybatis数据权限简单思路如下,希望某个角色拥有某个数据权限,比如admin用户可以查看所有部门数据,普通用户只能查看自己部门数据,这就要在sql中根据部门id去筛选。
但是又不想所有方法都要手动筛选,容易出错,也很麻烦,所以计划动态拼接sql,在每行sql后面拼接一个部门id in (....),起到一个自动过滤的作用。
思路如下:
写一个注解接口作为动态传参,写一个apo来使用注解参数,查询这个用户的角色,看到角色配置的数据权限,是所有部门还是只能看到自己部门信息。
将sql拼接的信息带入实体类中,在xml里面用ognl表达式,${变量} 拼接这个sql,起到自动拼接查询条件,来过滤的作用。
这里坑在哪里呢?
一切都写好了,但是每次运行之后,sql体永远是我在xml里面写的,比如
select * from sys_user where #{params.dataScope}
然后动态变量 #{params.dataScope}是 departmentId = 1 ,完整拼接应该是 select * from sys_user where departmentId = 1
但是没有! 真实情况是sql体一直是 select * from sys_user where,然后参数是 departmentId = 1,这个参数永远变不成sql体去执行,结果当然是语法错误。
这个问题从7点开始找晚上1点,从床上找到沙发上,来回了五六次,最后突然间发先别人用的是 ${params.dataScope} ,我用的是 #{params.dataScope}
后来百度了一下 # & 的区别是,#会把参数自动带上 ' ' 单引号,带上单引号之后会变成参数去处理,而$不会,它会保留原来参数的样子,这样就可以和xml里面的sql进行
正确的拼接。