非切面方式:
配置文件:自己的数据库连接
datasource:
primary:
jdbc-url: 你的数据库1连接地址
driver-class-name: com.mysql.cj.jdbc.Driver
username: user
password: password
secondary:
jdbc-url: 你的数据库2连接地址
driver-class-name: com.mysql.cj.jdbc.Driver
username: user
password: password
数据源的配置文件:
package com.qf.config;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource db1DataSource() {
return new HikariDataSource();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource db2DataSource() {
return new HikariDataSource();
}
}
@ConfigurationProperties注解里面的参数,对应的是配置文件中的路径,这里会直接创建为DataSource类。这里有两个数据源,所以通过@Bean的name参数来区分数据源。这个类只是加载数据源就行。
以下是将多数据源进行分开配置,一个数据源一个配置文件:
主数据源:
package com.qf.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
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.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.qf.mapper.db1", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
// 之前加载好的数据源,进行引入
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(primaryDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/db1/*.xml"));
return sessionFactory.getObject();
}
@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(primaryDataSource);
}
}
这里需要注意的事情是@MapperScan注解需要是tk.mybatis.spring.annotation.MapperScan;包下面的。否则会切换失败, basePackages 这个的参数就是主数据库的实体类对应的mapper的位置。sqlSessionFactoryRef 这个参数是给这个数据源配置一个工厂。就是primarySqlSessionFactory() 方法返回的工厂。
classpath*:mapper/db1/*.xml : 换为自己这个数据源对应的xml地址就行
@Primary 注解是声明这个数据源为主数据源,在没确认数据源的情况下,会自动使用这个数据源
次级数据源:
package com.qf.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.qf.mapper.db2", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(secondaryDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/db2/*.xml"));
return sessionFactory.getObject();
}
@Bean
public PlatformTransactionManager secondaryTransactionManager() {
return new DataSourceTransactionManager(secondaryDataSource);
}
}
注意: 这里就不要加@Primary注解,其他都是一样的。
示例:
启动类:
controller:
package com.qf.controller;
import com.qf.config.QFDataSource;
import com.qf.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private IOrderService iOrderService;
/**
* 添加上数据
* @return
*/
@PostMapping("/createOrder")
public Object createOrder() {
return iOrderService.createOrder();
}
}
service:
package com.qf.service.impl;
import com.qf.demo.entity.QfOrder;
import com.qf.mapper.db2.QfOrderMapper;
import com.qf.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class IOrderServiceImpl implements IOrderService {
@Autowired
private QfOrderMapper qfOrderMapper;
@Override
public Object createOrder() {
QfOrder order = new QfOrder();
order.setOrderNumber("515151561");
order.setName(555.223);
order.setAmount(123.23);
qfOrderMapper.insert(order);
return order;
}
}
mapper:
package com.qf.mapper.db2;
import com.qf.demo.entity.QfOrder;
import tk.mybatis.mapper.common.Mapper;
/**
* @author Administrator
* @description 针对表【qf_order】的数据库操作Mapper
* @createDate 2024-12-02 14:12:31
* @Entity com.qf.demo.entity.QfOrder
*/
public interface QfOrderMapper extends Mapper<QfOrder> {
}
我的包路径:
数据库: