<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css"> 
                          <div id="content_views" class="markdown_views"> 
        <!-- flowchart 箭头图标 勿删 --> 
        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> 
          <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> 
        </svg> 
        <p>  在开发的过程中我们可能都会遇到对接公司其他系统等需求,对于外部的系统可以采用接口对接的方式,对于一个公司开发的两个系统,并且知道相关数据库结构的情况下,就可以考虑使用多数据源来解决这个问题。SpringBoot为我们提供了相对简单的实现。</p> 

一、建立如下结构的maven项目
这里写图片描述

二、添加相关数据库配置信息

server: 
  port: 8080 
 
spring:   
  datasource: 
    master: 
      driver-class-name: com.mysql.jdbc.Driver 
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false 
      username: root 
      password: 123456 
    slaver: 
      driver-class-name: com.mysql.jdbc.Driver 
      url: jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=utf-8&useSSL=false 
      username: root 
      password: 123456
   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、主库和从库的相关配置
1、主库数据源配置

@Configuration 
@MapperScan(basePackages = "com.somta.springboot.dao.master", sqlSessionTemplateRef  = "masterSqlSessionTemplate") 
public class MasterDataSourceConfiguration { 
 
    @Value("${spring.datasource.master.driver-class-name}") 
    private String driverClassName; 
 
    @Value("${spring.datasource.master.url}") 
    private String url; 
 
    @Value("${spring.datasource.master.username}") 
    private String username; 
 
    @Value("${spring.datasource.master.password}") 
    private String password; 
 
    @Bean(name = "masterDataSource") 
    @Primary 
    public DataSource dataSource() { 
        DruidDataSource dataSource = new DruidDataSource(); 
        dataSource.setDriverClassName(this.driverClassName); 
        dataSource.setUrl(this.url); 
        dataSource.setUsername(this.username); 
        dataSource.setPassword(this.password); 
        return dataSource; 
    } 
 
    @Bean(name = "masterSqlSessionFactory") 
    @Primary 
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { 
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 
        bean.setDataSource(dataSource); 
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml")); 
        return bean.getObject(); 
    } 
 
    @Bean(name = "masterTransactionManager") 
    @Primary 
    public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) { 
        return new DataSourceTransactionManager(dataSource); 
    } 
 
    @Bean(name = "masterSqlSessionTemplate") 
    @Primary 
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { 
        return new SqlSessionTemplate(sqlSessionFactory); 
    } 
 
}
   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

2、从库的数据源配置信息

@Configuration 
@MapperScan(basePackages = "com.somta.springboot.dao.slaver", sqlSessionTemplateRef  = "slaverSqlSessionTemplate") 
public class SlaverDataSourceConfiguration { 
 
    @Value("${spring.datasource.slaver.driver-class-name}") 
    private String driverClassName; 
 
    @Value("${spring.datasource.slaver.url}") 
    private String url; 
 
    @Value("${spring.datasource.slaver.username}") 
    private String username; 
 
    @Value("${spring.datasource.slaver.password}") 
    private String password; 
 
 
    @Bean(name = "slaverDataSource") 
    public DataSource dataSource() { 
        DruidDataSource dataSource = new DruidDataSource(); 
        dataSource.setDriverClassName(this.driverClassName); 
        dataSource.setUrl(this.url); 
        dataSource.setUsername(this.username); 
        dataSource.setPassword(this.password); 
        return dataSource; 
    } 
 
    @Bean(name = "slaverSqlSessionFactory") 
    public SqlSessionFactory sqlSessionFactory(@Qualifier("slaverDataSource") DataSource dataSource) throws Exception { 
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); 
        bean.setDataSource(dataSource); 
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/slaver/**/Mysql_*Mapper.xml")); 
        return bean.getObject(); 
    } 
 
    @Bean(name = "slaverTransactionManager") 
    public DataSourceTransactionManager transactionManager(@Qualifier("slaverDataSource") DataSource dataSource) { 
        return new DataSourceTransactionManager(dataSource); 
    } 
 
    @Bean(name = "slaverSqlSessionTemplate") 
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { 
        return new SqlSessionTemplate(sqlSessionFactory); 
    } 
 
}
   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

  注意在配置数据源的信息时,一定要通过@Primary配置一个主库,对于数据库配置部分与普通的数据源配置没有差异,新建一个DataSource,在创建一个SqlSessionTemplate,最后创建一个SqlSessionTemplate,分别以此注入即可,@MapperScan注解的扫描路径要分别对于相应的dao层

四、编写dao层和xml

public interface UserMasterDao { 
    int addUser(User user); 
    int deleteUserById(Long id); 
    int updateUserById(User user); 
    User queryUserById(Long id); 
    List<User> queryUserList(); 
} 

   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
<?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.somta.springboot.dao.master.UserMasterDao" >  
<!-- Result Map--> 
<resultMap id="BaseResultMap" type="com.somta.springboot.pojo.User" > 
    <result column="id" property="id"/> 
    <result column="name" property="name"/> 
    <result column="age" property="age"/> 
</resultMap> 
 
<!-- th_role_user table all fields --> 
<sql id="Base_Column_List" > 
    id, name, age 
</sql> 
 
<insert id="addUser" parameterType="com.somta.springboot.pojo.User" > 
    insert into t_user (id, name, age)  
    values (#{id},#{name},#{age}); 
</insert> 
 
<delete id="deleteUserById" parameterType="java.lang.Long"> 
 delete from t_user where id=#{id} 
</delete> 
 
<update id="updateUserById" parameterType="com.somta.springboot.pojo.User" > 
    update t_user set  
    <trim  suffixOverrides="," > 
    <if test="id != null and id != ''"> 
        id=#{id}, 
    </if> 
    <if test="name != null and name != ''"> 
        name=#{name}, 
    </if> 
    <if test="age != null and age != ''"> 
        age=#{age}, 
    </if> 
    </trim> where id=#{id} 
</update> 
 
<select id="queryUserById" resultMap="BaseResultMap" parameterType="java.lang.Long"> 
    select <include refid="Base_Column_List" />  
    from t_user where id = #{id} 
</select> 
 
<select id="queryUserList" resultMap="BaseResultMap"> 
    select <include refid="Base_Column_List" />  
    from t_user 
</select> 
 
</mapper>    

   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

五、编写测试类进行测试

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = Application.class) 
public class MultiDatasourceTest { 
    @Autowired 
    private UserMasterDao masterUserDao; 
    @Autowired 
    private UserSlaverDao slaverUserDao; 
    /** 
     * 查询用户 
     * @throws Exception 
     */ 
    @Test 
    public void testQueryUser() throws Exception { 
        User masterUser = masterUserDao.queryUserById(1L); 
        System.out.println("masterUser==>"+masterUser.getName()); 
 
        User slaverUser = slaverUserDao.queryUserById(1L); 
        System.out.println("slaverUser==>"+slaverUser.getName()); 
    } 
} 

   
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

当在控制台看到如下所示输出就代表我们的配置已经成功了
这里写图片描述

Git代码地址:IT虾米网
原文地址:IT虾米网

   </div> 
      <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"> 

原文地址:IT虾米网


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

使用@import导入实现了ImportBeanDefinitionRegistrar接口的类,不能被注册为bean知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。