zoukankan      html  css  js  c++  java
  • SpringBoot集成Mybatis配置动态数据源

    很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程。

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>dynamic-datsource-samples</artifactId>
            <groupId>com.baomidou</groupId>
            <version>1.0.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>dynamic-druid-mybatis-sample</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
            <dependency>
                <groupId>p6spy</groupId>
                <artifactId>p6spy</artifactId>
                <version>3.8.0</version>
            </dependency>
        </dependencies>
    </project>

    application.yaml

    spring:
      datasource:
        dynamic:
          p6spy: true
          #      druid: #以下是全局默认值,可以全局更改
          #        initial-size:
          #        max-active:
          #        min-idle:
          #        max-wait:
          #        time-between-eviction-runs-millis:
          #        time-between-log-stats-millis:
          #        stat-sqlmax-size:
          #        min-evictable-idle-time-millis:
          #        max-evictable-idle-time-millis:
          #        test-while-idle:
          #        test-on-borrow:
          #        test-on-return:
          #        validation-query:
          #        validation-query-timeout:
          #        use-global-datasource-stat:
          #        async-init:
          #        clear-filters-enable:
          #        reset-stat-enable:
          #        not-full-timeout-retry-count:
          #        max-wait-thread-count:
          #        fail-fast:
          #        phyTimeout-millis:
          #        keep-alive:
          #        pool-prepared-statements:
          #        init-variants:
          #        init-global-variants:
          #        use-unfair-lock:
          #        kill-when-socket-read-timeout:
          #        connection-properties:
          #        max-pool-prepared-statement-per-connection-size:
          #        init-connection-sqls:
          #        share-prepared-statements:
          #        connection-errorretry-attempts:
          #        break-after-acquire-failure:
          #        filters: stat,wall # 注意这个值和druid原生不一致,默认启动了stat,wall
          datasource:
            master:
              username: sa
              password: "LYIXYTfaq9ug7bqAfcoU1gQovp/Atx7wsdJ5D7oFN5QMqZUI4OGHyMkCA7IxtYAIQr/8cMVFGo9oa/mqtMrzmQ=="
              url: jdbc:h2:mem:test
              driver-class-name: org.h2.Driver
              druid: #这里可以重写默认值
                initial-size: 5
                public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUVA/IL/iON8f63bv2i/pIAK+1sXY228slLkTKrI9axwBMIoPV7+PqdRTv6uqMl3j6nei0EDBWEu/Wp/qOQ/ScCAwEAAQ==
            slave_1:
              username: sa
              password: "123456"
              url: jdbc:h2:mem:test
              driver-class-name: org.h2.Driver
              druid:
                initial-size: 6
            slave_2:
              username: sa
              password: "123456"
              url: jdbc:h2:mem:test
              driver-class-name: org.h2.Driver
            slave_3:
              username: sa
              password: "123456"
              url: jdbc:h2:mem:test
              driver-class-name: org.h2.Driver
    logging:
      level:
        com.baomidou: debug

    spy.properties

    appender=com.p6spy.engine.spy.appender.Slf4JLogger

    User.java

    public class User {
    
        private Integer id;
    
        private String name;
    
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }

    UserMapper.java

    import com.baomidou.samples.druid.mybatis.entity.User;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface UserMapper {
    
        @Insert("INSERT INTO user (name,age) values (#{name},#{age})")
        boolean addUser(@Param("name") String name, @Param("age") Integer age);
    
        @Select("SELECT * FROM user where age > #{age}")
        List<User> selectUsers(@Param("age") Integer age);
    }

    UserService.java

    import com.baomidou.samples.druid.mybatis.entity.User;
    
    import java.util.List;
    
    public interface UserService {
    
        void addUser(User user);
    
        List selectUsersFromDs();
    
        List selectUserFromDsGroup();
    }

    UserServiceImpl.java

    import com.baomidou.dynamic.datasource.annotation.DS;
    import com.baomidou.samples.druid.mybatis.entity.User;
    import com.baomidou.samples.druid.mybatis.mapper.UserMapper;
    import com.baomidou.samples.druid.mybatis.service.UserService;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource
        private UserMapper userMapper;
    
        @Override
        public void addUser(User user) {
            userMapper.addUser(user.getName(), user.getAge());
        }
    
        @DS("slave_1")
        @Override
        public List selectUsersFromDs() {
            return userMapper.selectUsers(1);
        }
    
        @DS("slave")
        @Override
        public List selectUserFromDsGroup() {
            return userMapper.selectUsers(1);
        }
    }

    Application.java

    import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
    @MapperScan("com.baomidou.samples.druid.mybatis.mapper")
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    ApplicationTest.java

    import com.baomidou.samples.druid.mybatis.Application;
    import com.baomidou.samples.druid.mybatis.entity.User;
    import com.baomidou.samples.druid.mybatis.service.UserService;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Random;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = Application.class)
    public class ApplicationTest {
    
        private Random random = new Random();
    
        @Autowired
        private UserService userService;
    
        @Autowired
        private DataSource dataSource;
    
        @Before
        public void beforeTest() {
            try {
                Connection connection = dataSource.getConnection();
                connection.createStatement().execute("CREATE TABLE IF NOT EXISTS  USER (
    " +
                        "  id BIGINT(20) NOT NULL AUTO_INCREMENT,
    " +
                        "  name VARCHAR(30) NULL DEFAULT NULL ,
    " +
                        "  age INT(11) NULL DEFAULT NULL ,
    " +
                        "  PRIMARY KEY (id)
    " +
                        ");");
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    
        @Test
        public void addUser() {
            User user = new User();
            user.setName("测试用户" + random.nextInt());
            user.setAge(random.nextInt(100));
            userService.addUser(user);
        }
    
        @Test
        public void selectUsersFromDs() {
            userService.selectUsersFromDs();
        }
    
        @Test
        public void selectUserFromDsGroup() {
            userService.selectUserFromDsGroup();
        }
    
    }

    以上是利用了一个开源的动态数据源的一个框架。

    以上部分内容来自网络,有问题可以在下面评论,技术问题可以私聊我。

    QQ技术群:213365178

  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/c1024/p/11012017.html
Copyright © 2011-2022 走看看