@Bean public MybatisPlusInterceptor mybatisPlusInterceptor(TenantProperties properties){ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); // 必须保证多租户插件在分页插件之前,这个是 MyBatis-plus 的规定 if (properties.getEnable()) { mybatisPlusInterceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantDatabaseHandler(properties))); } // 分页插件 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; }
使用示例如下:这里提供了一个常见的案例:用户和角色关联查询的SQL:getUserList()
<selectid="getUserList"resultType="com.plasticene.textile.entity.User"> select u.* from user u left join user_role r on u.id = r.user_id <where> <iftest="query.status != null"> and u.status = #{query.status} </if> <iftest="query.roleId != null"> and r.role_id = #{query.roleId} </if> <iftest="query.keyword != null"> and ((u.name like concat('%',#{query.keyword},'%')) or (u.mobile like concat(#{query.keyword},'%'))) </if> <iftest="query.startEntryTime != null"> and u.entry_time >= #{query.startEntryTime} </if> <iftest="query.endEntryTime != null"> <![CDATA[ and u.entry_time <= #{query.endEntryTime}]]> </if>
</where> group by u.id order by u.id desc </select>
[1658720355293990912] [DEBUG] [2023-05-17 14:25:25.504] [http-nio-16688-exec-1@23652] com.plasticene.textile.dao.UserDAO.getUserList debug : ==> Preparing: SELECT u.* FROM user u LEFT JOIN user_role r ON u.id = r.user_id AND r.org_id = 3 WHERE u.org_id = 3 GROUP BY u.id ORDER BY u.id DESC LIMIT ? [1658720355293990912] [DEBUG] [2023-05-17 14:25:25.505] [http-nio-16688-exec-1@23652] com.plasticene.textile.dao.UserDAO.getUserList debug : ==> Parameters: 20(Long)
Druid也可以解析SQL,我们都知道SQL语句会生成语法树,两者对SQL解析的孰强孰弱(特别是复杂SQL)不得而知,可以自行验证对比,我这里给出一个JSqlParser解析出错的情况,把上面的SQL语句user_role r 改为 user_role ur
select u.* from user u left join user_role ur on u.id = ur.user_id
按照上面一样调用执行getUserList(), 会报解析错误:
Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: select u.* from user u left join user_role ur on u.id = ur.user_id group by u.id order by u.id desc at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39) at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52) at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:65) at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62) at com.sun.proxy.$Proxy178.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151) ... 101 common frames omitted Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "ur" <K_ISOLATION> at line 2, column 29.