• Spring Boot整合MyBatis多数据源


    Spring Boot整合MyBatis多数据源

    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。

    首先创建Spring Boot工程

    添加MyBatis、Druid依赖(这里的Druid必须是专为Spring boot打造的Druid,不能使用传统的Druid)、MySQL以及Web依赖,完整的依赖如下:

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <!--注意配置版本号-->
                <version>5.1.28</version>
         https://i.cnblogs.com/EditCategories.aspx?catid=1       <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!--druid连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
        </dependencies>
    

    多数据源配置

    接下来配置多数据源,在application.properties中配置数据库基本信息,然后提供两个DataSource即可,下面是简单的application.properties中的配置:

    spring.datasource.one.url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
    spring.datasource.one.username=root
    spring.datasource.one.password=123456
    spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
    
    spring.datasource.two.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
    spring.datasource.two.username=root
    spring.datasource.two.password=123456
    spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
    

    然后创建DataSourceConfig 配置类,里面配置对应的两个数据源:

    @Configuration
    public class DataSourceConfig {
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.one")
        DruidDataSource dsOne() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.two")
        DruidDataSource dsTwo() {
            return DruidDataSourceBuilder.create().build();
        }
    }
    

    MyBatis配置

    这里需要配置两个Bean,所以两个数据源分两个类配置:

    @Configuration//声明该类是一个配置类
    @MapperScan(basePackages = "com.lwh.mybatistest.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
    //扫描的包是com.lwh.mybatistest.mapper
    //SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。
    public class MyBatisConfigOne {
        @Resource(name = "dsOne")
        DataSource dsOne;
    
        @Bean
        SqlSessionFactory sqlSessionFactory1() {
            SqlSessionFactory sessionFactory = null;
            try {
                SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
                bean.setDataSource(dsOne);
                sessionFactory = bean.getObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sessionFactory;
        }
    
        @Bean
        SqlSessionTemplate sqlSessionTemplate1() {
            return new SqlSessionTemplate(sqlSessionFactory1());
        }
    }
    

    依照第一个配置,配置第二个数据源即可,这里需要注意因为操作的是不同的数据源,所以扫描的包是不一样的,不同的Mapper将操作不同的数据源。如下:

    @Configuration//声明该类是一个配置类
    @MapperScan(basePackages = "com.lwh.mybatistest.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
    public class MyBatisConfigTwo {
        @Resource(name = "dsTwo")
        DataSource dsTwo;
    
        @Bean
        SqlSessionFactory sqlSessionFactory2() {
            SqlSessionFactory sessionFactory = null;
            try {
                SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
                bean.setDataSource(dsTwo);
                sessionFactory = bean.getObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sessionFactory;
        }
    
        @Bean
        SqlSessionTemplate sqlSessionTemplate2() {
            return new SqlSessionTemplate(sqlSessionFactory2());
        }
    }
    

    项目结构如下:

    上面的mapper.xml文件是用MyBatis逆向工程生成的,这里不再赘述。
    在Maven项目中,官方建议我们把XML文件放在resources文件下,如果放在java下面,项目打包的时候会自动的过滤掉,所以我们在Maven的配置文件中,让项目不要过滤我们的XML文件,因此我们需要在pom.xml配置文件中的 bulid 节点里面添加配置信息,如下:

    <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
    </build>
    

    这样项目在打包发布的时候,就不会过滤掉我们的mapper.xml文件了

    数据库one的数据为:

    数据库two的数据为:

    现在去测试类测试我们的配置是否成功:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MybatistestApplicationTests {
    
        @Autowired
        BookMapper bookMapper;
        @Autowired
        BookMapper2 bookMapper2;
        @Test
        public void contextLoads() {
            List<Book> list = bookMapper.getAllBook();
            System.out.println("第一个:" + list);
            System.out.println("第二个:" + bookMapper2.getAllBook());
    
        }
    
    }
    

    输出结果为:

    第一个:[Book{id=1, bookname='三国演义', author='罗贯中'}]
    第二个:[Book{id=2, bookname='红楼梦', author='曹雪芹'}]

    因此我们的项目多数据源的操作就配置成功了!

    总结:

    1,首先给Spring Boot项目引入相关的依赖。
    2,在application.properties中配置多个数据库相关信息,创建DataSource配置类。
    3,分别给不同的数据库配置对应的Mybatis配置类,不同的mapper操作对应的数据库。

    以上配置教程参考江南一点雨的博客。

  • 相关阅读:
    CCF计算机职业资格认证考试 201809-2 买菜
    【CodeVS3013】单词背诵
    【CodeVS3304】水果姐逛水果街Ⅰ
    【CodeVS4246】奶牛的身高
    【hdu1247】Hat’s Words
    【CodeVS4189】字典
    【CodeVS4244】平衡树练习
    【poj3264】Balanced Lineup
    【树状数组】
    【CodeVS1163】访问艺术馆
  • 原文地址:https://www.cnblogs.com/lwhsummer/p/11223617.html
Copyright © 2020-2023  润新知