Springboot + Mybatis multi-data source

This is the 15th day of my participation in Gwen Challenge

Test: multiple mysql connections, using Druid connection pool

1. Dependence, druid, web, lombok, mysql, mybatis

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>  <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> < artifactId > mybatis - spring - the boot - starter < / artifactId > < version > 2.1.0 < / version > < / dependency > <! --Druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> The < version > 1.1.10 < / version > < / dependency >Copy the code

2. Application. properties Configure two data sources

#mysql spring.datasource.one.url=jdbc:mysql://localhost:3306/test? serverTimezone=UTC spring.datasource.one.username=root spring.datasource.one.password= spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.two.url=jdbc:mysql://localhost:3306/workflow? serverTimezone=UTC spring.datasource.two.username=root spring.datasource.two.password= spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSourceCopy the code

3. Configure two data sources and two Mapper

MybatisConfigOne .java

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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.annotation.Resource; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.mybatis.demo.mapper.mapper1", sqlSessionFactoryRef = "sqlSessionFactoryOne", sqlSessionTemplateRef = "sqlSessionTemplateOne") public class MybatisConfigOne { @Resource(name = "dsOne") DataSource dsOne; @Bean SqlSessionFactory sqlSessionFactoryOne() { SqlSessionFactory sessionFactory = null; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dsOne); / / add the hump mapping org. Apache. Ibatis. Session. The Configuration Configuration = new org. Apache. Ibatis. Session. The Configuration (); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); try { sessionFactory = bean.getObject(); } catch (Exception e) { e.printStackTrace(); } return sessionFactory; } @Bean SqlSessionTemplate sqlSessionTemplateOne() { return new SqlSessionTemplate(sqlSessionFactoryOne()); }}Copy the code

MybatisConfigOne .java

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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.mybatis.demo.mapper.mapper2", sqlSessionFactoryRef = "sqlSessionFactoryTwo", sqlSessionTemplateRef = "sqlSessionTemplateTwo") public class MybatisConfigTwo { @Resource(name = "dsTwo") DataSource dsTwo; @Bean SqlSessionFactory sqlSessionFactoryTwo() { SqlSessionFactory sessionFactory = null; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dsTwo); / / add the hump mapping org. Apache. Ibatis. Session. The Configuration Configuration = new org. Apache. Ibatis. Session. The Configuration (); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); try { sessionFactory = bean.getObject(); } catch (Exception e) { e.printStackTrace(); } return sessionFactory; } @Bean SqlSessionTemplate sqlSessionTemplateTwo() { return new SqlSessionTemplate(sqlSessionFactoryTwo()); }}Copy the code

Two Mappers are placed in different directories

import com.mybatis.demo.domain.Test;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface TestDao1 {
//public interface TestDao2 {
    @Select("select * from mybatis")
    List<Test> listTest();

}
Copy the code

4. Data can be queried. Ok

5. Other issues:

1) In the case of multiple data sources, the hump mapping does not take effect and the field is null

In the case of multiple data sources, Spring does not know which data source to enable camel name for, and manually add it when configuring the data source, as shown below

@Bean SqlSessionFactory sqlSessionFactoryOne() { SqlSessionFactory sessionFactory = null; SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dsOne); / / add the hump mapping org. Apache. Ibatis. Session. The Configuration Configuration = new org. Apache. Ibatis. Session. The Configuration (); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); try { sessionFactory = bean.getObject(); } catch (Exception e) { e.printStackTrace(); } return sessionFactory; }Copy the code

Druid = druid; druid = jdbC-URL; druid = jdbC-URL;

@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.one") DataSource dsOne() { // return DruidDataSourceBuilder.create().build(); return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.two") DataSource dsTwo() { // return DruidDataSourceBuilder.create().build(); return DataSourceBuilder.create().build(); }}Copy the code