mybatis数据权限的坑

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进行

正确的拼接。

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值