SpringBoot2.x 多数据源切换、druid监控、tk

依赖 版本
Springboot 2.1.8
tk 4.0.3
mapper 4.0.3
druid 1.1.10

依赖:

 <!--核心配置-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/>
    </parent>

    <!--版本控制-->
    <properties>
        <mybatis.version>2.0.0</mybatis.version>
        <mapper.version>4.0.3</mapper.version>
        <druid.version>1.1.10</druid.version>
    </properties>

    <!--依赖管理-->
    <dependencies>
        <!--web项目-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
         <!--mysql连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--aspectj-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!--mybatis依赖 @Select,@insert,@Delete,@Update等注解-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!--tk-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>${mapper.version}</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

配置文件:

server:
  port: 80
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_parent?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
    username: root
    password: dhdadj.98
    type: com.alibaba.druid.pool.DruidDataSource
    #监控
    druid:
      #连接池配置
      max-active: 30
      initial-size: 3
      min-idle: 3
      max-wait: 1200
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 30000
      pool-prepared-statements: true
      max-open-prepared-statements: 30
      validation-query: select 1 from dual
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      #URI监控
      web-stat-filter:
        enabled: true
        #监控所有uri
        url-pattern: /*
        #不监控以下uri
        exclusions: /druid/*
        #session监控
        session-stat-enable: true
        profile-enable: true
      #spring监控
      aop-patterns: com.database.*
      #登录配置
      stat-view-servlet:
        login-username: root
        login-password: touzhen.98
mybatis:
  mapper-locations: classpath:mapper/*.xml
  #映射实体类
  type-aliases-package: com.database.entity
  #实体类属性驼峰转换
  configuration.map-underscore-to-camel-case: true
  #打印sql
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

实体类:

package com.database.entity.db1;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

/**
 * (User)实体类
 *
 * @author makejava
 * @since 2020-08-04 22:33:26
 */
@Data
@Table(name = "user")
public class User implements Serializable {
    private static final long serialVersionUID = 913577582974147917L;

    @Id
    private  Integer id;
    /**
     * 用户
     */
    private  String name;
    /**
     * 备注
     */
    private  String remart;
    /**
     * 邮箱地址
     */
    private  String email;
    /**
     * 手机号码
     */
    private  String mobile;
    /**
     * 密码
     */
    private  String pwd;
    /**
     * 用户创建时间
     */
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private  Date createDate;


    public User() {
    }

    private User(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.remart = builder.remart;
        this.email = builder.email;
        this.mobile = builder.mobile;
        this.pwd = builder.pwd;
        this.createDate = builder.createDate;
    }

    @Override
    public String toString() {
        return "Builder{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", remart='" + remart + '\'' +
                ", email='" + email + '\'' +
                ", mobile='" + mobile + '\'' +
                ", pwd='" + pwd + '\'' +
                ", createDate=" + createDate +
                '}';
    }



   public static class Builder {
        private  Integer id;
        /**
         * 用户
         */
        private  String name;
        /**
         * 备注
         */
        private  String remart;
        /**
         * 邮箱地址
         */
        private  String email;
        /**
         * 手机号码
         */
        private  String mobile;
        /**
         * 密码
         */
        private  String pwd;
        /**
         * 用户创建时间
         */
        private  Date createDate;


        public Builder  setId(Integer id) {
            this.id = id;
            return this;
        }

        public Builder  setName(String name) {
            this.name = name;
            return this;
        }

        public Builder  setRemart(String remart) {
            this.remart = remart;
            return this;
        }

        public Builder  setEmail(String email) {
            this.email = email;
            return this;
        }

        public Builder  setMobile(String mobile) {
            this.mobile = mobile;
            return this;
        }

        public Builder  setPwd(String pwd) {
            this.pwd = pwd;
            return this;
        }

        public Builder  setCreateDate(Date createDate) {
            this.createDate = createDate;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }

}
package com.database.entity.db1;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Table(name="t_sys_database")
@Getter
@Setter
public class Database {

    /**
     * 
     */

    private static final long serialVersionUID = 2959567867207055588L;

    @Id
    @Column(name = "id")
    protected Integer id;
    private String code;
    private String name;
    private String type;
    private String dc;
    private String url;
    private String userName;
    private String passWord;

    private String creator;
    private Object creatorId;
    private Date createDate;
    private Boolean deleted;

}
package com.database.entity.db2;

import lombok.Data;

import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

/**
 * (AdRole)实体类
 *
 * @author makejava
 * @since 2020-08-17 09:41:28
 */
@Data
@Table(name = "ad_role")
public class AdRole implements Serializable {
    private static final long serialVersionUID = 500075010950193252L;

    private Integer id;

    private String name;

    private Date addDate;

    private String remart;


    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 Date getAddDate() {
        return addDate;
    }

    public void setAddDate(Date addDate) {
        this.addDate = addDate;
    }

    public String getRemart() {
        return remart;
    }

    public void setRemart(String remart) {
        this.remart = remart;
    }

}

通用Mapper:

package com.database.common;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * @projectName(项目名称): sb-parent
 * @Description(描述): 集成
 * @Author(开发人员): 梁港生
 * @date(日期): 2020.08.04 22:35
 * @Version(版本): V1.0
 */
public interface TkMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

自定义sql和tk并用的Mapper:

package com.database.dao.db1;

import com.database.common.TkMapper;
import com.database.entity.db1.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @projectName(项目名称): sb-parent
 * @Description(描述):mybatis mapper测试
 * @Author(开发人员): 梁港生
 * @date(日期): 2020.08.04 22:34
 * @Version(版本): V1.0
 */
public interface UserMapper extends TkMapper<User> {

    /**
     * @Description(描述): 查询所有
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 00:35
     * @Param(参数):
     * @return(返回值):
     */
    @Select("select * from user")
    List<User> findAll();


    /**
     * @Description(描述): 添加用户
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 00:38
     * @Param(参数):
     * @return(返回值):
     */
    @Insert("insert into user(`name`,pwd,email,mobile,remart) values(#{name},#{pwd},#{email},#{mobile},#{remart})")
    @SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = int.class)
    int insert(User user);


    /**
     * @Description(描述): 根据用户更新密码
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 00:39
     * @Param(参数):
     * @return(返回值):
     */
    @Update("update user set pwd = #{pwd} where name = #{name}")
    int update(User user);


    /**
     * @Description(描述): 根据id删除
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 00:40
     * @Param(参数):
     * @return(返回值):
     */
    @Delete("delete FROM  user where id = #{id}")
    int deleteById(User user);


    /**
     * @Description(描述): 根据id查询
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 01:17
     * @Param(参数):
     * @return(返回值):
     */
    @SelectProvider(method = "selectById", type = Provider.class)
    User selectById(int id);


    /**
     * @Description(描述): 根据id更新
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 01:17
     * @Param(参数):
     * @return(返回值):
     */
    @UpdateProvider(method = "updateById", type = Provider.class)
    int updateById(User user);

    /**
     * @Description(描述): 根据id删除
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 01:17
     * @Param(参数):
     * @return(返回值):
     */
    @DeleteProvider(method = "deleteByIds", type = Provider.class)
    int deleteByIds(int id);


     /**
      * @Description(描述): 添加数据
      * @Author(开发人员): Kukyu
      * @date(日期): 2020.08.05 01:22
      * @Param(参数):
      * @return(返回值):
      */
    @InsertProvider(method = "insertByUser",type = Provider.class)
    int insertByUser(User user);


    /**
     * @Description(描述): 动态sql拼接
     * @Author(开发人员): Kukyu
     * @date(日期): 2020.08.05 01:17
     * @Param(参数):
     * @return(返回值):
     */
    class Provider {

        public static String selectById(int id) {
            StringBuilder sb = new StringBuilder();
            sb.append("select * from user where id = #{id}");
            return sb.toString();
        }


        public static String updateById(User user) {
            StringBuilder sb = new StringBuilder();
            sb.append("update user set name = #{name} where id = #{id}");
            return sb.toString();
        }


        public static String deleteByIds(int id) {
            StringBuilder sb = new StringBuilder();
            sb.append("delete from user where id = #{id}");
            return sb.toString();
        }


        public static String insertByUser(User user) {
            StringBuilder sb = new StringBuilder();
            sb.append("insert into user(`name`,pwd,email,mobile,remart) values(#{name},#{pwd},#{email},#{mobile},#{remart})");
            return sb.toString();
        }


    }

}
package com.database.dao.db2;

import com.database.common.TkMapper;
import com.database.entity.db2.AdRole;

/**
 * @projectName(项目名称): sb-parent
 * @Description(描述):
 * @Author(开发人员): 梁港生
 * @date(日期): 2020.08.17 09:42
 * @Version(版本): V1.0
 */
public interface AdRoleMapper extends TkMapper<AdRole> {
}

省略服务层跳控制层:

package com.database.controller.db1;

import com.database.dao.db1.UserMapper;
import com.database.entity.db1.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @projectName(项目名称): sb-parent
 * @Description(描述):
 * @Author(开发人员): 梁港生
 * @date(日期): 2020.08.17 09:43
 * @Version(版本): V1.0
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserMapper userMapper;


    @RequestMapping("/findAll")
    public List<User> findAll(){
        List<User> all = userMapper.findAll();
        return all;
    }


}
package com.database.controller.db2;

import com.database.dao.db2.AdRoleMapper;
import com.database.dataSource.DataSourceSwitch;
import com.database.entity.db2.AdRole;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @projectName(项目名称): sb-parent
 * @Description(描述):
 * @Author(开发人员): 梁港生
 * @date(日期): 2020.08.17 09:44
 * @Version(版本): V1.0
 */
@RestController
@RequestMapping("/role")
public class AdRoleController {

    @Resource
    private AdRoleMapper adRoleMapper;

    @RequestMapping("/findAll")
    public List<AdRole> findAll(){
        DataSourceSwitch.set("db_admin");
        List<AdRole> all = adRoleMapper.selectAll();
        DataSourceSwitch.set(null);
        return all;
    }

}

druid监控管理地址(http://127.0.0.1/druid)
主数据源测试接口(http://127.0.0.1/user/findAll)
其他数据源测试接口(http://127.0.0.1/role/findAll)

自问自答:
1、如何切换数据源?

  • 先要在数据库表写入数据源配置
  • 修改数据源配置类(代码太多不粘贴出来给源码)DynamicDataSourceRegister的MapperScan注解扫描路径
  • DataSourceSwitch.set(“db_admin”)切换数据源,使用完记得切换回主数据源DataSourceSwitch.set(null)

2、druid作用?

  • 查看项目性能
  • 细化自己的操作
  • 账号密码在yml配置文件里

3、项目结构说明
SpringBoot2.x 多数据源切换、druid监控、tk

源码地址(gitee):(HTTPS)gitee.com/kukycol/sb-parent.git

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

多数据源切换下的事务处理怎么处理呢

3年前 评论
kukycol (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!