Spring Boot 集成mybatis-plus 的多租户插件

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

具体介绍查看官方文档,我也不是很熟。

官方文档2.x:https://baomidou.gitee.io/mybatis-plus-doc/#/quick-start

最新官方文档3.x:https://mp.baomidou.com/guide/quick-start.html

 

遇到的问题:

1.依赖引入(注意版本的兼容性)

特别说明:MybatisMybatis-Spring依赖请勿加入项目配置,以免引起版本冲突!!!Mybatis-Plus会自动帮你维护!

如果是项目后期引入Mybatis-Plus需要注意自己项目本身的MybatisMybatis-Spring版本从而引入适合的mybatis-plus 版本,我是用的就不是最新的。


	com.baomidou
	mybatis-plus-boot-starter
	3.0.4


	com.baomidou
	mybatis-plus
	3.0.4


	com.baomidou
	mybatis-plus-generator
	3.0.4

Spring Boot 集成mybatis-plus 的多租户插件_第1张图片可在官方文档上跳转到GitHub上查看不同版本的Mybatis-Plus 对应使用的mybatis版本

2.添加过滤配置文件

package com.biomatch.qadm.util.interceptor;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Invocation;
import org.apache.shiro.SecurityUtils;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import com.biomatch.qadm.bean.vo.Operator;
import com.biomatch.qadm.util.Constants;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;

/**
 * @since 2019-07-23
 */
@Configuration
@MapperScan("com.biomatch.qadm.service.impl.dao.impl.*")
@EnableTransactionManagement
public class MybatisPlusConfig {

	/*
    // 从配置获取
    @Value("{}")
	private boolean tenantEnabled;*/
    /**
     * 多租户属于 SQL 解析部分,依赖 MP 分页插件
     */
    @Bean("paginationInterceptor")
    public Interceptor paginationInterceptor() {
        // 可实现是否启用多租户功能
    	/*if(!tenantEnabled){
    		return dummyInterceptor();
    	}*/
    	
    	
    	PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        /* 
         * 【测试多租户】 SQL 解析处理拦截器
* 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )
*/ //System.out.println("MybatisPlusConfig000"); List sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId() { //System.out.println("MybatisPlusConfig-getTenantId"); return new LongValue(1L); } @Override public String getTenantIdColumn() { //System.out.println("MybatisPlusConfig-getTenantIdColumn"); return "tenant_id"; } @Override public boolean doTableFilter(String tableName) { //System.out.println("MybatisPlusConfig-doTableFilter"); // 这里可以判断是否过滤表 /*if ("user".equals(tableName)) { return true; }*/ return false; } }); sqlParserList.add(tenantSqlParser); paginationInterceptor.setSqlParserList(sqlParserList); /*paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { @Override public boolean doFilter(MetaObject metaObject) { // getMappedStatement 方法不知道版本才实现,作用无法也就是获取sql的执行路径和SQL语句,可自己实现获取即可 // MappedStatement ms = PluginUtils.getMappedStatement(metaObject); MappedStatement ms = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现 if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) { return true; } return false; } });*/ return paginationInterceptor; } /** * 性能分析拦截器,不建议生产使用 * 用来观察 SQL 执行情况及执行时长 */ @Bean("performanceInterceptor") public Interceptor performanceInterceptor(){ return new PerformanceInterceptor(); } public Interceptor dummyInterceptor(){ return new Interceptor(){ @Override public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } @Override public Object plugin(Object target) { return target; } @Override public void setProperties(Properties properties) { } }; } }

3.在jdbc配置时添加mybatis-plus分页插件


    
	
	
	
	
		
            
			
			
		
	 

配置完成:

最后在执行SQL时会在where条件添加上tenant_id='1'

insert 时 也会添加 字段tenant_id

 

SQL拦截器需要用到的类

1.获取方法名

StatementHandler statementHandler = (StatementHandler) invocation.getTarget();  
MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);  
MappedStatement mappedStatement=(MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
String selectId=mappedStatement.getId();
// selectId 的值为:com.baomidou.springboot.mapper.UserMapper.selectListBySQL

2.获取sql

BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");  
// 分页参数作为参数对象parameterObject的一个属性
String sql = boundSql.getSql();
Common co=(Common)(boundSql.getParameterObject());

注意:

1.mybatis 编写sql时,一些符号使用转移字符,否则 mybatis-plus 无法识别,会报符号异常

原符号         替换符号
1.<            <
2.<=           <=
3.>            >
4.>=           >=
5.&            &
6.'           '
7."           "
8.!=          <>

2.这个框架好像不识别双引号,使用单引号代替双引号,反正SQL识别时单引号也可以表示字符串

你可能感兴趣的:(mybatis,java,框架集成,JAVA类包,springboot,Mybatis)