##springboot 2.x Mybatis 多数据源
先照着配,仔细看文档,文档最后有细节说明
application.yml
细节 数据库信息需要在 hikari 节点下
参数名称 jdbc-url 与 driver-class-name
server:
port: 8080
spring:
datasource:
hikari:
test1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: ******
test2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: ******
配置文件
两个配置文件基本一致,名称不同 一个有@Primary 注解一个没有
DataSource1Config
package com.sykj.jdj.config.datasource;
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.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.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.sykj.jdj.dao.test1", sqlSessionFactoryRef = "test1SqlSessionFactory") //配置需要扫描的包
public class DataSource1Config {
@Bean(name = "test1")
@Qualifier("test1")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.hikari.test1")
public DataSource test1DataSource() {
DataSource build = DataSourceBuilder.create().build();
return build;
}
@Bean(name = "test1SqlSessionFactory")
// 表示这个数据源是默认数据源
@Primary
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
//配置扫描的xml
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test1/*.xml");
bean.setMapperLocations(resources);
return bean.getObject();
}
@Bean("test1SqlSessionTemplate")
// 表示这个数据源是默认数据源
@Primary
public SqlSessionTemplate test1SqlSessionTemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
###DataSource2Config
package com.sykj.jdj.config.datasource;
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.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 javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.sykj.jdj.dao.test2", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {
@Bean(name = "test2")
@Qualifier("test2")
@ConfigurationProperties(prefix="spring.datasource.hikari.test2")
public DataSource test2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test2SqlSessionFactory")
// 表示这个数据源是默认数据源
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test2/*.xml"));
return bean.getObject();
}
@Bean("test2SqlSessionTemplate")
// 表示这个数据源是默认数据源
public SqlSessionTemplate test2SqlSessionTemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}
###JdjApplication
package com.sykj.jdj;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableAutoConfiguration
public class JdjApplication {
public static void main(String[] args) {
SpringApplication.run(JdjApplication.class, args);
}
}
###User1Dao
package com.sykj.jdj.dao.test1;
import com.sykj.jdj.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface User1Dao {
User selectById(Integer id);
}
###User2Dao
package com.sykj.jdj.dao.test2;
import com.sykj.jdj.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface User2Dao {
User selectById(Integer id);
}
###TestService
package com.sykj.jdj.service;
import com.sykj.jdj.dao.test1.User1Dao;
import com.sykj.jdj.dao.test2.User2Dao;
import com.sykj.jdj.entity.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class TestService {
@Resource
private User1Dao user1Dao;
@Resource
private User2Dao user2Dao;
public User test1(){
User user = user1Dao.selectById(1);
return user;
}
public User test2(){
return user2Dao.selectById(1);
}
}
###User1Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sykj.jdj.dao.test1.User1Dao">
<resultMap id="resultMap" type="com.sykj.jdj.entity.User">
<id column="id" property="id"/>
<result column="nickName" property="nickName"/>
</resultMap>
<select id="selectById" resultMap="resultMap" resultType="java.lang.Integer">
select * from user where id = #{id}
</select>
</mapper>
###User2Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sykj.jdj.dao.test2.User2Dao">
<resultMap id="resultMap" type="com.sykj.jdj.entity.User">
<id column="id" property="id"/>
<result column="nickName" property="nickName"/>
</resultMap>
<select id="selectById" resultMap="resultMap" resultType="java.lang.Integer">
select * from user where id = #{id}
</select>
</mapper>
项目结构
C:.
└─src
└─main
├─java
│ └─com
│ └─sykj
│ └─jdj
│ ├─config
│ │ ├─datasource
│ ├─controller
│ ├─dao
│ │ ├─test1
│ │ └─test2
│ ├─entity
│ ├─service
│ └─util
└─resources
├─mapper
│ ├─test1
│ └─test2
├─static
└─templates
项目细节方面
- User1Dao与User2Dao 必须位于两个不同的包下
- User1Dao与User2Dao 必须名称不相同,哪怕在不同的包下,名称也必须不相同
- User1Mapper 与 User2Mapper 必须位于不同的文件夹下