解决RuoYiPro的mybatisPuls中由于数据权限问题自动在sql后拼接 “and null” 的问题

解决RuoYiPro的mybatisPuls中由于数据权限问题自动在sql后拼接 “and null” 的问题

问题复现:

在这里插入图片描述

问题描述:

由于开启了多租户功能,所以再查询部门表的时候会自动拼接上Tenant_id,用于隔离不同租户单位的数据,但是又多拼接了 “and null”

问题排查:

首先debug,定位到拼接sql的地方,既mybatisPlus的sql拦截器(InnerInterceptor)

在这里插入图片描述

由DataPermissionDatabaseInterceptor类实现了mybatisPlus的拦截器,会调用到对应的sql类型的实现方法,比如select或update等等,然后构建MPBoundSql类执行sql操作,在执行sql操作之前,对sql进行拦截,并拼接需要的sql,即通过调用parseSingle()函数进行解析sql

在这里插入图片描述
在这里插入图片描述

再判断出是select类型时,调用DataPermissionDatabaseInterceptor类重写的processSelect()方法,而不是当前的this方法(当前方法直接抛出异常,就是如果不重写就抛异常)

在这里插入图片描述

诡异的地方出来了,在处理mainTable的时候调用了一个builderExpression()的函数,看名称应该是构建条件参数的,点进去看,破案了

在这里插入图片描述
这里会判断一下查询的表是否有数据权限控制,如果有,还要查询当前用户的数据权限是否符合
在这里插入图片描述
依次点进去看会看到构建参数的过程
在这里插入图片描述
在这里插入图片描述
出问题的关键就在这里,由于没有获取到数据权限,这里会返回一个null的数组,导致后续sql拼接的时候出现 “and null”的情况,成功破案

最终的解决方案:

原本的逻辑是没问题的,问题的根源就在于没有查到数据权限的数据,之所以没有查到,是因为数据不在这里维护,得改从其他地方查

PS:
这个问题排查了很久,但是如果把执行的sql的日志打出来会更容易排查,我这次也是忽略了日志,导致做了很多多余的排查,

在这里插入图片描述

就是这个日志,打印的日志太长了导致没看完全,以为不重要以至于忽略了,

这个也有解决方法:
在这里插入图片描述

加一个换行符合解决。
以上就是这次非Admin账号的数据库执行命令拼接了and null 问题的解决思路和过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
mybatis执行sql语句部分参数返回null问题通常是由于参数类型与实际传入参数类型不匹配导致的。为了解决这个问题,我们需要对参数进行调试和检查。下面,我们提供几种常用的解决方案。 1.在SqlMapper.xml添加参数类型 在SqlMapper.xml文件对参数类型进行明确声明,可以避免参数传递出现歧义。例如,在参数为字符串类型时,可以使用如下的方式声明参数类型: <parameterMap type="java.lang.String" /> 2.修改Java对象对应的类 在Java对象对应的类,修改该属性的类型,使其与数据库对应的列类型一致。例如,如果数据的列为varchar类型,就需要将Java对象的类对应属性的类型设置为String类型。 3.使用TypeHandler 通过使用TypeHandler,可以将Java对象的属性映射到数据对应的列上,避免了参数类型不匹配的情况。例如,对于通过Java对象传递的时间,可使用如下的TypeHandler实现对时间进行转换: public class DateTypeHandler extends BaseTypeHandler<Date> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException { ps.setTimestamp(i, new Timestamp(parameter.getTime())); } @Override public Date getNullableResult(ResultSet rs, String columnName) throws SQLException { return new Date(rs.getTimestamp(columnName).getTime()); } @Override public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return new Date(rs.getTimestamp(columnIndex).getTime()); } @Override public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return new Date(cs.getTimestamp(columnIndex).getTime()); } } 使用TypeHandler,可以将Java对象的属性与数据库对应的列进行映射,解决参数类型不匹配的问题。 总之,解决mybatis执行sql语句部分参数返回null问题需要认真检查参数类型的匹配问题,并对参数类型进行适当的调整和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值