Bootstrap

论mybatisPlus 连表插件(MPJBaseMapper) 与自定义SQL注入器冲突

mybatisplus 的好处就不用多说了,带给我们最大的好处就是不用再重复编写那些简单的sql语句。但是多表查询的时候却还是不得不用xml来解决,但是想要偷懒,不想写xml,于是去网上搜索了下是否有连表插件,居然还真有。于是乎就拿下来试用下,问题就来了,由于项目里有写过自定义的sql注入器,加上链表插件后,启动居然报错了,于是乎查看源码分析原因,发现连表插件里也用到了sql注入器,原来如此,现在问题显而易见了。

因为连表插件里和项目原先配置里都有sql注入器,导致springboot容器在实例化类时不知选择哪一个,所以报错Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed。

看错误原因就知道该如何解决了,在项目原有的sql注入器实现类上加上@Primary 注解,意思是默认优先选择:

public class MybatisPlusConfig {
    /**
     * 分页插件 
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
    	
        //连表插件
        interceptor.addInnerInterceptor(new MPJInterceptor());
        //多租户,垃圾sql拦截插件......
        return interceptor;
    }
    
    /**
     * sql注入
     */
    @Bean
    @Primary
    public MySqlInjector myLogicSqlInjector() {
        return new MySqlInjector();
    }

这样虽然解决了报错问题,但是新的问题又出现了,由于设置了@Primary 默认加载,意味着连表插件里的功能就没法加载进去了,所以需要手动把里面实现的方法重新加入到项目里原有的sql注入器里:

1、先查看连表插件的源码,找到sql注入器的加载类,如下

package com.github.yulichang.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.github.yulichang.method.*;

import java.util.List;

/**
 * SQL 注入器
 *
 * @author yulichang
 * @see DefaultSqlInjector
 */
public class MPJSqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> list = super.getMethodList(mapperClass);
        list.add(new SelectJoinOne());
        list.add(new SelectJoinList());
        list.add(new SelectJoinPage());
        list.add(new SelectJoinMap());
        list.add(new SelectJoinMaps());
        list.add(new SelectJoinMapsPage());
        return list;
    }
}

2、将注入器里添加的方法添加到项目原有的sql注入器里,如下:

import java.util.List;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import com.github.yulichang.method.SelectJoinList;
import com.github.yulichang.method.SelectJoinMap;
import com.github.yulichang.method.SelectJoinMaps;
import com.github.yulichang.method.SelectJoinMapsPage;
import com.github.yulichang.method.SelectJoinOne;
import com.github.yulichang.method.SelectJoinPage;

/**
 *  @Description:注入自定义SQL方法
 *  @author: zijin.lee 
 *  @date:  2021年4月6日
 */
public class MySqlInjector extends DefaultSqlInjector {

	@Override
	public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
		//将原来的保持 
		List<AbstractMethod> methodList = super.getMethodList(mapperClass);
		//将自定义的方法传入,这里用的是上面创建对象 
		methodList.add(new MysqlInsertOrUpdateBatch());
		methodList.add(new InsertBatchSomeColumn(t->true));
		methodList.add(new MysqlUpdateBatch());
		
		//多表查询sql注入 从连表插件里移植过来的
		methodList.add(new SelectJoinOne());
		methodList.add(new SelectJoinList());
		methodList.add(new SelectJoinPage());
		methodList.add(new SelectJoinMap());
		methodList.add(new SelectJoinMaps());
		methodList.add(new SelectJoinMapsPage());
		return methodList;
	}
    
}

最后保存代码,完美启动,测试功能正常,OK

;