1.config类代码
package com.yinta.query.config;
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.data.transaction.ChainedTransactionManager;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@Slf4j
@Configuration
@EnableTransactionManagement
public class MyBatisConfig implements TransactionManagementConfigurer {
@Bean(destroyMethod = "close")
@Primary
public DataSource yinta(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(yintaUrl);
ds.setUsername(yintaUser);
ds.setPassword(yintaPassword);
try {
List<Filter> proxyFilters = new ArrayList<Filter>();
WallFilter statFilter = new WallFilter();
WallConfig config = new WallConfig();
// 批量操作
config.setMultiStatementAllow(true);
statFilter.setConfig(config);
proxyFilters.add(statFilter);
ds.setProxyFilters(proxyFilters);
ds.setFilters("stat, wall");
} catch (SQLException e) {
e.printStackTrace();
}
return ds;
}
@Bean(name = "sqlSessionFactoryYinta")
@Primary
public SqlSessionFactory sqlSessionFactoryYinta() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(yinta());
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "sqlserver");
properties.setProperty("reasonable", "false");
properties.setProperty("pageSizeZero", "true");
pageHelper.setProperties(properties);
Interceptor[] plugins = new Interceptor[]{pageHelper};
bean.setPlugins(plugins);
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
Properties properties1 = new Properties();
configuration.setVariables(properties1);
bean.setConfiguration(configuration);
try {
//指定mapper xml目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath*:com/yinta/query/mapper/yinta/**/*.xml"));
return bean.getObject();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
}
/**
* 事物配置
*/
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
DataSourceTransactionManager dtm1 = new DataSourceTransactionManager(yinta());
DataSourceTransactionManager dtm2 = new DataSourceTransactionManager(yintaProduce());
DataSourceTransactionManager dtm3 = new DataSourceTransactionManager(yintaMysql());
ChainedTransactionManager ctm = new ChainedTransactionManager(dtm1,dtm2,dtm3);
return ctm;
}
@Bean(destroyMethod = "close")
@ConfigurationProperties(prefix = "yinta.muti-datasource-mysql")
public DataSource yintaMysql() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactoryYintaMysql")
public SqlSessionFactory sqlSessionFactoryYintaMysql() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(yintaMysql());
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
properties.setProperty("reasonable", "false");
properties.setProperty("pageSizeZero", "true");
pageHelper.setProperties(properties);
Interceptor[] plugins = new Interceptor[]{pageHelper};
bean.setPlugins(plugins);
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
Properties properties1 = new Properties();
configuration.setVariables(properties1);
bean.setConfiguration(configuration);
try {
//指定mapper xml目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath*:com/yinta/query/mapper/mysql/**/*.xml"));
return bean.getObject();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
}
}
1.MyBatisMapperScan类代码
package com.yinta.query.config.mybatis.scanner; import com.yinta.query.config.mybatis.annotation.YintaMysql; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.yinta.query.config.MyBatisConfig; import com.yinta.query.config.mybatis.annotation.Yinta; import com.yinta.query.config.mybatis.annotation.YintaProduce; /** * mapper 扫描 * * @author jeffrey.liu * @create 2019-07-23 08:59 **/ @Configuration @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScan { @Bean(name="mapperScannerConfigurerYinta") public MapperScannerConfigurer mapperScannerConfigurerYinta() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYinta"); mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.yinta"); mapperScannerConfigurer.setAnnotationClass(Yinta.class); return mapperScannerConfigurer; } @Bean(name="mapperScannerConfigurerYintaProduce") public MapperScannerConfigurer mapperScannerConfigurerYintaProduce() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYintaProduce"); mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.yintaproduce"); mapperScannerConfigurer.setAnnotationClass(YintaProduce.class); return mapperScannerConfigurer; } @Bean(name="mapperScannerConfigurerYintaMysql") public MapperScannerConfigurer mapperScannerConfigurerYintaMysql() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYintaMysql"); mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.mysql"); mapperScannerConfigurer.setAnnotationClass(YintaMysql.class); return mapperScannerConfigurer; } }
注意的点:
1.BasePackage不能重叠扫,sql覆盖过的mysql别重复扫描,否则读取mapper有问题
2. YintaMysql是一个自定义注解,实际上就是另加了repository注解,这样做的目的是分层分权限
3. 依赖jar包那些就不说了,mysql、sqlserver都得加进pom.xml