MybatisPlus是Mybatis的扩展库,它提供了更多的便捷操作和增强功能,是目前比较流行的Java持久层框架之一。在使用MybatisPlus框架时,我们可能需要连接多个不同的数据库,这时就会遇到双数据库驱动连接数据库的问题。下面是一份详细的攻略:
1.添加双数据库的配置文件
首先,我们需要添加MybatisPlus的配置文件,具体名字根据项目需要来定,这里以“mybatisplus.properties”为例。在文件中添加如下配置:
#master数据源配置
master.url=jdbc:mysql://localhost:3306/db_master?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
master.driver=com.mysql.cj.jdbc.Driver
master.username=root
master.password=root
#slave数据源配置
slave.url=jdbc:mysql://localhost:3306/db_slave?useSSL=false&useUnicode=true&CharacterEncoding=utf8&serverTimezone=Asia/Shanghai
slave.driver=com.mysql.cj.jdbc.Driver
slave.username=root
slave.password=root
其中,master和slave表示两个不同的数据库连接,可以根据实际需要自行修改。url、driver、username、password等字段需要根据具体的数据库配置来设置。
2.配置数据源和事务管理器
接着,在Spring Boot配置文件application.yml中添加以下配置:
# 数据源配置
spring:
datasource:
master:
url: ${master.url}
driver-class-name: ${master.driver}
username: ${master.username}
password: ${master.password}
slave:
url: ${slave.url}
driver-class-name: ${slave.driver}
username: ${slave.username}
password: ${slave.password}
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: datasource
minimum-idle: 5
maximum-pool-size: 30
auto-commit: true
idle-timeout: 180000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
connection-timeout: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
filter:
- com.alibaba.druid.filter.logging.Log4j2Filter
- com.alibaba.druid.filter.stat.StatFilter
# MyBatisPlus配置
mybatis-plus:
mapper-locations: classpath:/mapper/**Mapper.xml
global-config:
db-config:
id-type: auto
field-strategy: not_empty
logic-delete-value: 1
logic-not-delete-value: 0
banner: false
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
type-aliases-package: com.example.entity
# 事务管理器
transaction:
enabled: true
manager-type: jdbc
jdbc:
data-source: master
这里采用的是Hikari连接池,并且同时配置了master和slave两个数据源。注意到注入到事务管理器的是“master”数据源,这里可以根据实际需要来选择是否需要指定具体的数据源。
3.创建mybatis-plus的配置类
最后,我们需要创建一个MybatisPlus的配置类来整合以上配置,具体代码如下:
@Configuration
public class MybatisPlusConfig {
@Autowired
private Environment env;
@Bean(name="dataSource")
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
return ds;
}
@Bean
@Primary
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
// 分页插件
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
sqlSessionFactoryBean.setPlugins(new Interceptor[]{paginationInterceptor});
// mybatis注解驼峰转换
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration .setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(configuration);
return sqlSessionFactoryBean.getObject();
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setDbConfig(new GlobalConfig.DbConfig().setIdType(IdType.AUTO));
return globalConfig;
}
}
在这个配置类中,我们注入了上一步定义的数据源和事务管理器,并且配置了MybatisPlus所需的相关内容,包括分页插件和驼峰转换。
注意到这里我们使用了@Primary注解,在多个相同类型的Bean时将其作为首选Bean,这个注解可以在遇到多个数据源时指定主数据源。
示例
下面两个示例分别描述了如何在普通查询和分页查询时使用不同的数据源。
示例1:普通查询
在 DAO 层,使用 @Mapper 注解标识这是一个 Mapper,再使用 @MapperScan 扫描包路径,将Mapper加入spring IOC容器,如下所示:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
@Results({
@Result(property = "userId", column = "user_id"),
@Result(property = "userName", column = "user_name")
})
List<User> getUsers();
}
@MapperScan(basePackages = "com.example.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
在 Service 层,可以指定不同的数据源,这里使用 master 数据源进行查询,代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getUsers() {
return userMapper.getUsers();
}
}
如果要使用 slave 数据源进行查询,只需在相应的方法上添加该注解:
@Service
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("slaveSqlSessionTemplate")
private SqlSessionTemplate slaveSqlSessionTemplate;
@Override
public List<User> getUsers() {
return slaveSqlSessionTemplate.selectList("com.example.dao.UserMapper.getUsers");
}
}
示例2:分页查询
首先,我们需要在pom.xml文件中添加依赖:
<!--Mybatis Plus 分页插件 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
接着,我们需要在Service中注入分页插件PageHelper:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private PageHelper pageHelper;
@Override
public List<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return userMapper.getUsers();
}
}
在使用时,指定master或slave数据源即可:
@Autowired
@Qualifier("slavePageHelper")
private PageHelper slavePageHelper;
@Autowired
@Qualifier("masterPageHelper")
private PageHelper masterPageHelper;
public Page<User> getUsers(int pageNum, int pageSize) {
slavePageHelper.startPage(pageNum, pageSize);
return userMapper.getUsers();
}
public Page<User> getUsers(int pageNum, int pageSize) {
masterPageHelper.startPage(pageNum, pageSize);
return userMapper.getUsers();
}
到此为止,一个完整的双数据库配置过程就完成了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MybatisPlus配置双数据库驱动连接数据库问题 - Python技术站