本篇文章主要是集成 更多功能请参考官网 链接: https://mp.baomidou.com/guide/quick-start.html.
首先Boot整合mybatis
1.导入maven坐标
1.导入坐标
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2.配置类 用于扫包 (或者或者使用注解在启动类上@MapperScanner)
@Configuration
public class MyBatisPlusConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer(); scannerConfigurer.setBasePackage("com.cloud.demo");
return scannerConfigurer;
}
}
3.yml配置文件
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
typeAliasesPackage: com.ftsino.citychallenge.common.entity,com.ftsino.citychallenge.common.po
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
=============================================
接下来就是MP多数据源配置
1.引入dynamic依赖(动态数据源)
dynamic的版本查看
链接: https://mvnrepository.com.
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>
2.yml多数据源配置
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 内置加密,使用请查看详细文档
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
schema: db/schema.sql # 配置则生效,自动初始化表结构
data: db/data.sql # 配置则生效,自动初始化数据
continue-on-error: true # 默认true,初始化失败是否继续
separator: ";" # sql默认分号分隔符
#......省略
#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
3.使用注解@DS 来切换指定的数据库
(指定的是yml中配置的名字 如果不指定 走yml中的默认配置数据库)
@DS("slave_1")
public interface AccountMapper extends BaseMapper<Account> {
}
public interface UserMapper extends BaseMapper<User> {
}
==============================================
能力有限 多数据源采用的是jta+atomikos,并且动态数据源也没了…
欢迎指教
话不多说 立马开始
1.yml配置
spring:
datasource:
master:
url: jdbc:mysql://xx.xxx.xx.xxx:3306/xx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useAffectedRows=true
username: xxxx
password: xxxx
driver-class-name: com.mysql.jdbc.Driver
slave:
url: jdbc:mysql://xx.xxx.xx.xxx:3306/xx?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useAffectedRows=true
username: xxxx
password: Ftsino2019@
driver-class-name: com.mysql.jdbc.Driver
- db配置(主要是用来接受多个数据库配置)
注: 这如果加上@Configuration 则省略第四步
@Data
@ConfigurationProperties(prefix = "spring.datasource.master")
public class DB1Config {
private String url;
private String username;
private String password;
private String driverClassName;
}
- 普通的集成MP的通用mapper就不可以使用了 这里换成MP自带的工厂Bean
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.sql.SQLException;
@Configuration
@MapperScan(basePackages= {"com.wang.demo.mapper.db1"},sqlSessionFactoryRef="db1SqlSessionFactory")
public class DB1DataSourceConfig {
// 配置数据源
@Primary
@Bean("db1DataSource")
public DataSource testDataSource (DB1Config DB1Config) throws SQLException {
//表示使用的是mysql数据库
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(DB1Config.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(DB1Config.getPassword());
mysqlXaDataSource.setUser(DB1Config.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
//Atomikos负责管理所有的事务
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("db1DataSource");
return xaDataSource;
}
@Bean(name = "db1SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource)
throws Exception {
//注意,这里引入的事MP的工厂,而不是mybatis的工厂SqlSessionFactoryBean
MybatisSqlSessionFactoryBean bean=new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//引入Mapper.xml文件的位置
Resource[] resources = new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mapper/db1/*.xml");
bean.setMapperLocations(resources);
return bean.getObject();
}
@Bean(name = "db1SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(value = {DB2Config.class, DB1Config.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
最后来个项目总览
亲测可用!