• SpringBoot2.0--- 多数据源配置


                          <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代码地址:https://gitee.com/Somta/SpringBoot/tree/master/SpringBoot-multiDatasource
    原文地址:http://somta.com.cn/#/blog/view/05ef234aa6744aa4bc039869e2cfaffe

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

    原文地址:https://blog.csdn.net/husong_/article/details/80103497

  • 相关阅读:
    谈谈严格模式
    javascript回调函数那些事~
    border-radius:50%和100%究竟有什么区别
    canvas浅谈 实现简单的自旋转下落
    js中关于this的理解
    对js 面对对象编程的一些简单的理解
    ios中 input 焦点光标不垂直居中
    只能输入数字的正则表达式在火狐的兼容问题解决方法
    关于margin、padding 对内联元素的影响
    element ui 表格的合并
  • 原文地址:https://www.cnblogs.com/jpfss/p/11082969.html
Copyright © 2020-2023  润新知