可以自定义 Mybatis 拦截器改写 SQL 支持数据权限,该文提供另一种相对简单的方式支持数据权限。通过 Mybatis 的 sql、include、bind 标签实现动态生成 SQL 过滤数据,其中 Mybatis 可以调用静态方法,但在 include 标签里无法在调用静态方式时传递 include 参数。目前只找到利用 bind 标签把 include 参数绑定到变量,从而可以在调用静态方法时传递 include 参数。
数据权限SQL生成工具类
public class DataAuthHelper {
public static String generateSql(String tableName, String aliasName) {
// TODO 生成数据权限SQL
}
}
Mybatis SQL片段
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jasmine.DataAuth">
<sql id="autoSql">
<bind name="_tableName" value="'${tableName}'"/>
<bind name="_aliasName" value="'${aliasName}'"/>
${@jasmine.framework.persistence.mybatisplus.generator.DataAuthHelper@generateSql(_tableName, _aliasName)}
</sql>
</mapper>
使用 include 标签包含数据权限SQL
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxxx.xxxx.xxxx">
<select id="xxxx" resultMap="xxxx">
select t.* from xxxx t
where t.xxxx = xxxx
<inclue refid="jasmine.DataAuth.autoSql">
<property name="tableName" value="xxxx" />
<property name="aliasName" value="t" />
</include>
</select>
</mapper>
直接调用静态方法降低代码可读性
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxxx.xxxx.xxxx">
<select id="xxxx" resultMap="xxxx">
select t.* from xxxx t
where t.xxxx = xxxx
${@jasmine.framework.persistence.mybatisplus.generator.DataAuthHelper@generateSql('xxxx', 't')}
</select>
</mapper>