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

  • 相关阅读:
    Lc112_路径总和
    多线程(4)
    Lc257_二叉树的所有路径
    Lc226_翻转二叉树
    Lc145_二叉树的后序遍历
    Lc144_二叉树的前序遍历
    Lc102_二叉树的层序遍历
    Lc101_对称二叉树
    Lc100_相同的树
    Lc94_二叉树的中序遍历
  • 原文地址:https://www.cnblogs.com/c1024/p/11012017.html
Copyright © 2011-2022 走看看