Spring Boot整合Druid

Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池,使用非常广泛。以下就几个步骤来实现Spring Boot整合Druid。分别

搭建基础SpringBoot项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.durid</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.42</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>  
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

创建数据库脚本

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id',
  `username` varchar(45) NOT NULL COMMENT '账号',
  `password` varchar(45) NOT NULL COMMENT '密码',
  `money` decimal(10,0) NOT NULL COMMENT '余额',
  `role` varchar(45) NOT NULL COMMENT '角色',
  `reg_time` datetime DEFAULT NULL COMMENT '注册时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户信息表';

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'itmuch', '1111', '3', 'user', '2020-02-15 14:37:20');
INSERT INTO `user` VALUES ('2', 'jack', '1234', '145', 'user', '2020-02-29 21:27:59');
INSERT INTO `user` VALUES ('3', 'king', '1234', '145', 'vip', '2020-02-29 21:27:59');

通过mybatis-generator生成对应的实体类、mapper接口以及mapper文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!-- 指定外部的属性元素 对于context中配置数据库信息有用-->
    <!--     <properties resource="com/myproject/generatorConfig.properties"/> -->
    <!-- 常见用于指定驱动的路径 当jdbc驱动不在当前的classpath目录下时配置-->
    <!--     <classPathEntry location=""/> -->

    <!-- defaultModelType可设置flat、conditional(默认)、hierarchical,将defaultModelType设置为flat 则只为每张表生成一个实体类 -->
    <!-- targetRuntime可设置MyBatis3(默认) 或者 MyBatis3Simple 设置成后者不会生成与Example相关的方法-->
    <context id="testTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <commentGenerator type="org.mybatis.generator.internal.DefaultCommentGenerator">
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="false"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/ms_user"
                        userId="root"
                        password="root">
        </jdbcConnection>
        
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.example.durid.demo.entity" targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="sqlmapper" targetProject=".\src\main\resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.durid.demo.mapper"
                             targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table tableName="user" schema="" enableInsert="true" enableCountByExample="false"
               enableDeleteByPrimaryKey="true" enableSelectByExample="false" enableUpdateByExample="false"
               enableUpdateByPrimaryKey="false"
               enableDeleteByExample="false" enableSelectByPrimaryKey="true"/>
        <!-- 		<table tableName="TTRD_BIZ_EXT_SET_LOG_CTS" /> -->
        <!-- 		<table tableName="TSTK" /> -->

    </context>
</generatorConfiguration>

将以上文件放到src/main/resources目录下,并创建如下工具类

package com.example.durid.demo.generator;

import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

public class MybatisGeneratorMain {

    private static final Logger logger = LoggerFactory.getLogger(MybatisGeneratorMain.class);

    public void generator() throws Exception {
        // MBG执行过程中的警告信息
        List<String> warnings = new ArrayList<String>();
        // 当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //		File configFile = new File("resource/generatorConfig.xml");
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = resourceLoader.getResource("classpath:generatorConfig.xml");
        ConfigurationParser configurationParser = new ConfigurationParser(warnings);
        Configuration config = configurationParser.parseConfiguration(resource.getInputStream());
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
        if (logger.isWarnEnabled()) {
            for (String string : warnings) {
                logger.warn(string);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        try {
            MybatisGeneratorMain main = new MybatisGeneratorMain();
            main.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行main方法,此时就会生成如下三个文件

  1. com.example.durid.demo.entity目录下生成User.java
package com.example.durid.demo.entity;

import java.math.BigDecimal;
import java.util.Date;

public class User {
    
    private Integer id;

    private String username;

    private String password;

    private BigDecimal money;

    private String role;

    private Date regTime;

    // setter getter 略
}
  1. com.example.durid.demo.mapper努力下生成UserMapper.java
package com.example.durid.demo.mapper;

import com.example.durid.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {

    int deleteByPrimaryKey(Integer id);

    int insert(User user);

    User selectByPrimaryKey(Integer id);

    List<User> selectAll();
}
  1. 在src/main/resources/mapper文件夹下生成UserMapper.xml文件
<?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.example.durid.demo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.durid.demo.entity.User">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="username" jdbcType="VARCHAR" property="username"/>
        <result column="password" jdbcType="VARCHAR" property="password"/>
        <result column="money" jdbcType="DECIMAL" property="money"/>
        <result column="role" jdbcType="VARCHAR" property="role"/>
        <result column="reg_time" jdbcType="TIMESTAMP" property="regTime"/>
    </resultMap>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        delete from user
        where id = #{id,jdbcType=INTEGER}
    </delete>
    <insert id="insert" parameterType="com.example.durid.demo.entity.User">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        insert into user (id, username, password,
        money, role, reg_time
        )
        values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
        #{money,jdbcType=DECIMAL}, #{role,jdbcType=VARCHAR}, #{regTime,jdbcType=TIMESTAMP}
        )
    </insert>
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        select id, username, password, money, role, reg_time
        from user
        where id = #{id,jdbcType=INTEGER}
    </select>
    <select id="selectAll" resultMap="BaseResultMap">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        select id, username, password, money, role, reg_time
        from user
    </select>
</mapper>

创建服务层和控制层代码

package com.example.durid.demo.service;

import com.example.durid.demo.entity.User;

import java.util.List;

public interface UserService {

    boolean add(User user);

    List<User> list();

    boolean deleteById(Integer id);

    User findById(Integer id);
}

package com.example.durid.demo.service.impl;

import com.example.durid.demo.entity.User;
import com.example.durid.demo.mapper.UserMapper;
import com.example.durid.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public boolean add(User user) {
        return userMapper.insert(user) == 1;
    }

    @Override
    public List<User> list() {
        return userMapper.selectAll();
    }

    @Override
    public boolean deleteById(Integer id) {
        return userMapper.deleteByPrimaryKey(id) == 1;
    }

    @Override
    public User findById(Integer id) {
        return userMapper.selectByPrimaryKey(id);
    }
}

package com.example.durid.demo.controller;

import com.example.durid.demo.entity.User;
import com.example.durid.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // http://localhost:8083/user/list
    @RequestMapping("/list")
    public List<User> list() {
        return userService.list();
    }

    // http://localhost:8083/user/get/2
    @RequestMapping("/get/{id}")
    public User get(@PathVariable("id") Integer id) {
        return userService.findById(id);
    }

    // http://localhost:8083/user/delete/2
    @PostMapping("/delete/{id}")
    public boolean delete(@PathVariable("id") Integer id) {
        return userService.deleteById(id);
    }

    // http://localhost:8083/user/add
    @PostMapping("/add")
    public boolean add(@RequestBody User user) {
        return userService.add(user);
    }
}

配置application.properties文件

server.port=8083
# mybatis配置
mybatis.mapper-locations=classpath*:sqlMapper/**/*.xml
mybatis.type-aliases-package=com.example.durid.demo.entity
# 健康监控配置
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# 数据源配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ms_user
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 日志监控配置
logging.level.com.example.durid.demo.mapper=TRACE

通过SpringBoot启动类启动项目:

"C:\Program Files\Java\jdk1.8.0_121\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=56843:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\20191030\demo\target\classes;D:\maven\repo\org\springframework\boot\spring-boot-starter-web\2.2.5.RELEASE\spring-boot-starter-web-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter\2.2.5.RELEASE\spring-boot-starter-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-autoconfigure\2.2.5.RELEASE\spring-boot-autoconfigure-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-logging\2.2.5.RELEASE\spring-boot-starter-logging-2.2.5.RELEASE.jar;D:\maven\repo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\maven\repo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\maven\repo\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;D:\maven\repo\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;D:\maven\repo\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\maven\repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\maven\repo\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-json\2.2.5.RELEASE\spring-boot-starter-json-2.2.5.RELEASE.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-tomcat\2.2.5.RELEASE\spring-boot-starter-tomcat-2.2.5.RELEASE.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-core\9.0.31\tomcat-embed-core-9.0.31.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-el\9.0.31\tomcat-embed-el-9.0.31.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.31\tomcat-embed-websocket-9.0.31.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-validation\2.2.5.RELEASE\spring-boot-starter-validation-2.2.5.RELEASE.jar;D:\maven\repo\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\maven\repo\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;D:\maven\repo\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;D:\maven\repo\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\maven\repo\org\springframework\spring-web\5.2.4.RELEASE\spring-web-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-beans\5.2.4.RELEASE\spring-beans-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-webmvc\5.2.4.RELEASE\spring-webmvc-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-aop\5.2.4.RELEASE\spring-aop-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-context\5.2.4.RELEASE\spring-context-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-expression\5.2.4.RELEASE\spring-expression-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-actuator\2.2.5.RELEASE\spring-boot-starter-actuator-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-actuator-autoconfigure\2.2.5.RELEASE\spring-boot-actuator-autoconfigure-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-actuator\2.2.5.RELEASE\spring-boot-actuator-2.2.5.RELEASE.jar;D:\maven\repo\io\micrometer\micrometer-core\1.3.5\micrometer-core-1.3.5.jar;D:\maven\repo\org\hdrhistogram\HdrHistogram\2.1.11\HdrHistogram-2.1.11.jar;D:\maven\repo\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\maven\repo\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.1\mybatis-spring-boot-starter-2.1.1.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-jdbc\2.2.5.RELEASE\spring-boot-starter-jdbc-2.2.5.RELEASE.jar;D:\maven\repo\com\zaxxer\HikariCP\3.4.2\HikariCP-3.4.2.jar;D:\maven\repo\org\springframework\spring-jdbc\5.2.4.RELEASE\spring-jdbc-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-tx\5.2.4.RELEASE\spring-tx-5.2.4.RELEASE.jar;D:\maven\repo\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.1\mybatis-spring-boot-autoconfigure-2.1.1.jar;D:\maven\repo\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\maven\repo\org\mybatis\mybatis-spring\2.0.3\mybatis-spring-2.0.3.jar;D:\maven\repo\org\mybatis\generator\mybatis-generator-core\1.3.7\mybatis-generator-core-1.3.7.jar;D:\maven\repo\org\mybatis\generator\mybatis-generator-maven-plugin\1.3.7\mybatis-generator-maven-plugin-1.3.7.jar;D:\maven\repo\org\apache\maven\maven-plugin-api\3.5.4\maven-plugin-api-3.5.4.jar;D:\maven\repo\org\apache\maven\maven-model\3.5.4\maven-model-3.5.4.jar;D:\maven\repo\org\apache\commons\commons-lang3\3.9\commons-lang3-3.9.jar;D:\maven\repo\org\apache\maven\maven-artifact\3.5.4\maven-artifact-3.5.4.jar;D:\maven\repo\org\eclipse\sisu\org.eclipse.sisu.plexus\0.3.3\org.eclipse.sisu.plexus-0.3.3.jar;D:\maven\repo\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar;D:\maven\repo\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;D:\maven\repo\javax\inject\javax.inject\1\javax.inject-1.jar;D:\maven\repo\org\eclipse\sisu\org.eclipse.sisu.inject\0.3.3\org.eclipse.sisu.inject-0.3.3.jar;D:\maven\repo\org\codehaus\plexus\plexus-component-annotations\1.5.5\plexus-component-annotations-1.5.5.jar;D:\maven\repo\org\codehaus\plexus\plexus-utils\3.1.0\plexus-utils-3.1.0.jar;D:\maven\repo\org\codehaus\plexus\plexus-classworlds\2.5.2\plexus-classworlds-2.5.2.jar;D:\maven\repo\mysql\mysql-connector-java\5.1.42\mysql-connector-java-5.1.42.jar;D:\maven\repo\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\maven\repo\org\springframework\spring-core\5.2.4.RELEASE\spring-core-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-jcl\5.2.4.RELEASE\spring-jcl-5.2.4.RELEASE.jar" com.example.durid.demo.DemoApplication

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.5.RELEASE)

2020-03-03 14:00:05.710  INFO 9680 --- [           main] com.example.durid.demo.DemoApplication   : Starting DemoApplication on B940 with PID 9680 (D:\20191030\demo\target\classes started by Administrator in D:\20191030\demo)
2020-03-03 14:00:05.720  INFO 9680 --- [           main] com.example.durid.demo.DemoApplication   : No active profile set, falling back to default profiles: default
2020-03-03 14:00:07.739  INFO 9680 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8083 (http)
2020-03-03 14:00:07.760  INFO 9680 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-03-03 14:00:07.761  INFO 9680 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.31]
2020-03-03 14:00:08.027  INFO 9680 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-03-03 14:00:08.030  INFO 9680 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2215 ms
2020-03-03 14:00:09.036  INFO 9680 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-03-03 14:00:09.372  INFO 9680 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 13 endpoint(s) beneath base path '/actuator'
2020-03-03 14:00:09.467  INFO 9680 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8083 (http) with context path ''
2020-03-03 14:00:09.470  INFO 9680 --- [           main] com.example.durid.demo.DemoApplication   : Started DemoApplication in 4.483 seconds (JVM running for 6.0)
2020-03-03 14:00:09.916  INFO 9680 --- [)-192.168.7.201] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
Tue Mar 03 14:00:09 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2020-03-03 14:00:10.120  INFO 9680 --- [)-192.168.7.201] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

通过浏览器发送请求:http://localhost:8083/user/list

返回:

[
    {
        "id": 1,
        "username": "itmuch",
        "password": "1111",
        "money": 3,
        "role": "user",
        "regTime": "2020-02-15T06:37:20.000+0000"
    },
    {
        "id": 2,
        "username": "jack",
        "password": "1234",
        "money": 145,
        "role": "user",
        "regTime": "2020-02-29T13:27:59.000+0000"
    },
    {
        "id": 3,
        "username": "king",
        "password": "1234",
        "money": 145,
        "role": "vip",
        "regTime": "2020-02-29T13:27:59.000+0000"
    }
]

那么此时使用的数据源是哪个呢?通过SpringBoot监控http://localhost:8083/actuator/beans查看,并查找出DataSource这个类型的Bean信息如下:

"dataSource": {
  "aliases": [],
  "scope": "singleton",
  "type": "com.zaxxer.hikari.HikariDataSource",
  "resource": "class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]",
  "dependencies": [
	"spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties"
  ]
}

resource类中对应代码如下:

 @Configuration(
        proxyBeanMethods = false
    )
    @ConditionalOnClass({HikariDataSource.class})
    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"},
        havingValue = "com.zaxxer.hikari.HikariDataSource",
        matchIfMissing = true
    )
    static class Hikari {
        Hikari() {
        }

        @Bean
        @ConfigurationProperties(
            prefix = "spring.datasource.hikari"
        )
        HikariDataSource dataSource(DataSourceProperties properties) {
            HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
            if (StringUtils.hasText(properties.getName())) {
                dataSource.setPoolName(properties.getName());
            }

            return dataSource;
        }
    }

当容器中不存在DataSource类型Bean且当前classpath下存在HikariDataSource类的时候,就会创建一个HikariDataSource类型的DataSource

整合Druid数据源

需要整合Druid数据源,首先查看官网:https://github.com/alibaba/druid
在这里插入图片描述

在官网中,很容易就看到了Druid在Spring Boot中整合的starter项目:Druid Spring Boot Starter

官网如下:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

以下内容参照官网(官网是最权威的)

引入对应的依赖:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.17</version>
</dependency>

重新启动boot项目

"C:\Program Files\Java\jdk1.8.0_121\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=58065:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\20191030\demo\target\classes;D:\maven\repo\org\springframework\boot\spring-boot-starter-web\2.2.5.RELEASE\spring-boot-starter-web-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter\2.2.5.RELEASE\spring-boot-starter-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-logging\2.2.5.RELEASE\spring-boot-starter-logging-2.2.5.RELEASE.jar;D:\maven\repo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\maven\repo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\maven\repo\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;D:\maven\repo\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;D:\maven\repo\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\maven\repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\maven\repo\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-json\2.2.5.RELEASE\spring-boot-starter-json-2.2.5.RELEASE.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;D:\maven\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-tomcat\2.2.5.RELEASE\spring-boot-starter-tomcat-2.2.5.RELEASE.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-core\9.0.31\tomcat-embed-core-9.0.31.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-el\9.0.31\tomcat-embed-el-9.0.31.jar;D:\maven\repo\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.31\tomcat-embed-websocket-9.0.31.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-validation\2.2.5.RELEASE\spring-boot-starter-validation-2.2.5.RELEASE.jar;D:\maven\repo\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\maven\repo\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;D:\maven\repo\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;D:\maven\repo\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\maven\repo\org\springframework\spring-web\5.2.4.RELEASE\spring-web-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-beans\5.2.4.RELEASE\spring-beans-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-webmvc\5.2.4.RELEASE\spring-webmvc-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-aop\5.2.4.RELEASE\spring-aop-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-context\5.2.4.RELEASE\spring-context-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-expression\5.2.4.RELEASE\spring-expression-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-actuator\2.2.5.RELEASE\spring-boot-starter-actuator-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-actuator-autoconfigure\2.2.5.RELEASE\spring-boot-actuator-autoconfigure-2.2.5.RELEASE.jar;D:\maven\repo\org\springframework\boot\spring-boot-actuator\2.2.5.RELEASE\spring-boot-actuator-2.2.5.RELEASE.jar;D:\maven\repo\io\micrometer\micrometer-core\1.3.5\micrometer-core-1.3.5.jar;D:\maven\repo\org\hdrhistogram\HdrHistogram\2.1.11\HdrHistogram-2.1.11.jar;D:\maven\repo\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\maven\repo\com\alibaba\druid-spring-boot-starter\1.1.10\druid-spring-boot-starter-1.1.10.jar;D:\maven\repo\com\alibaba\druid\1.1.10\druid-1.1.10.jar;D:\maven\repo\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\maven\repo\org\springframework\boot\spring-boot-autoconfigure\2.2.5.RELEASE\spring-boot-autoconfigure-2.2.5.RELEASE.jar;D:\maven\repo\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.1\mybatis-spring-boot-starter-2.1.1.jar;D:\maven\repo\org\springframework\boot\spring-boot-starter-jdbc\2.2.5.RELEASE\spring-boot-starter-jdbc-2.2.5.RELEASE.jar;D:\maven\repo\com\zaxxer\HikariCP\3.4.2\HikariCP-3.4.2.jar;D:\maven\repo\org\springframework\spring-jdbc\5.2.4.RELEASE\spring-jdbc-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-tx\5.2.4.RELEASE\spring-tx-5.2.4.RELEASE.jar;D:\maven\repo\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.1\mybatis-spring-boot-autoconfigure-2.1.1.jar;D:\maven\repo\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\maven\repo\org\mybatis\mybatis-spring\2.0.3\mybatis-spring-2.0.3.jar;D:\maven\repo\org\mybatis\generator\mybatis-generator-core\1.3.7\mybatis-generator-core-1.3.7.jar;D:\maven\repo\org\mybatis\generator\mybatis-generator-maven-plugin\1.3.7\mybatis-generator-maven-plugin-1.3.7.jar;D:\maven\repo\org\apache\maven\maven-plugin-api\3.5.4\maven-plugin-api-3.5.4.jar;D:\maven\repo\org\apache\maven\maven-model\3.5.4\maven-model-3.5.4.jar;D:\maven\repo\org\apache\commons\commons-lang3\3.9\commons-lang3-3.9.jar;D:\maven\repo\org\apache\maven\maven-artifact\3.5.4\maven-artifact-3.5.4.jar;D:\maven\repo\org\eclipse\sisu\org.eclipse.sisu.plexus\0.3.3\org.eclipse.sisu.plexus-0.3.3.jar;D:\maven\repo\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar;D:\maven\repo\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;D:\maven\repo\javax\inject\javax.inject\1\javax.inject-1.jar;D:\maven\repo\org\eclipse\sisu\org.eclipse.sisu.inject\0.3.3\org.eclipse.sisu.inject-0.3.3.jar;D:\maven\repo\org\codehaus\plexus\plexus-component-annotations\1.5.5\plexus-component-annotations-1.5.5.jar;D:\maven\repo\org\codehaus\plexus\plexus-utils\3.1.0\plexus-utils-3.1.0.jar;D:\maven\repo\org\codehaus\plexus\plexus-classworlds\2.5.2\plexus-classworlds-2.5.2.jar;D:\maven\repo\mysql\mysql-connector-java\5.1.42\mysql-connector-java-5.1.42.jar;D:\maven\repo\org\springframework\spring-core\5.2.4.RELEASE\spring-core-5.2.4.RELEASE.jar;D:\maven\repo\org\springframework\spring-jcl\5.2.4.RELEASE\spring-jcl-5.2.4.RELEASE.jar" com.example.durid.demo.DemoApplication

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.5.RELEASE)

2020-03-03 14:24:46.097  INFO 10236 --- [           main] com.example.durid.demo.DemoApplication   : Starting DemoApplication on B940 with PID 10236 (D:\20191030\demo\target\classes started by Administrator in D:\20191030\demo)
2020-03-03 14:24:46.102  INFO 10236 --- [           main] com.example.durid.demo.DemoApplication   : No active profile set, falling back to default profiles: default
2020-03-03 14:24:48.530  INFO 10236 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8083 (http)
2020-03-03 14:24:48.541  INFO 10236 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-03-03 14:24:48.541  INFO 10236 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.31]
2020-03-03 14:24:48.669  INFO 10236 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-03-03 14:24:48.670  INFO 10236 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2486 ms
2020-03-03 14:24:48.894  INFO 10236 --- [           main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2020-03-03 14:24:49.081  INFO 10236 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
2020-03-03 14:24:49.841  INFO 10236 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-03-03 14:24:50.228  INFO 10236 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 13 endpoint(s) beneath base path '/actuator'
2020-03-03 14:24:50.345  INFO 10236 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8083 (http) with context path ''
2020-03-03 14:24:50.350  INFO 10236 --- [           main] com.example.durid.demo.DemoApplication   : Started DemoApplication in 4.93 seconds (JVM running for 6.658)
Tue Mar 03 14:24:51 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

查看bean信息并找到DataSource类型bean如下:

"dataSource": {
  "aliases": [],
  "scope": "singleton",
  "type": "com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper",
  "resource": "class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class]",
  "dependencies": [
	"spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties",
	"statFilter"
  ]
}

查看类定义:
在这里插入图片描述

DruidDataSourceWrapper继承了DruidDataSource

整合Druid数据源成功。另外通过以下配置可以配置池信息,提高数据层性能

# druid连接池配置
spring.datasource.druid.initial-size=8
spring.datasource.druid.max-active=50
spring.datasource.druid.min-idle=8
spring.datasource.druid.max-wait=8
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=8
spring.datasource.druid.validation-query=select 1
spring.datasource.druid.validation-query-timeout=3000
#spring.datasource.druid.test-on-borrow=
#spring.datasource.druid.test-on-return=
#spring.datasource.druid.test-while-idle=
#spring.datasource.druid.time-between-eviction-runs-millis=
#spring.datasource.druid.min-evictable-idle-time-millis=
#spring.datasource.druid.max-evictable-idle-time-millis=
#spring.datasource.druid.filters= #配置多个英文逗号分隔
实现多数据源

删除之前关于数据源的配置,将数据库ms_user复制一份为ms_class,然后添加配置

# Druid 数据源 1 配置,继承spring.datasource.druid.* 配置,相同则覆盖
spring.datasource.druid.one.url=jdbc:mysql://127.0.0.1:3306/ms_user
spring.datasource.druid.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.one.password=root
spring.datasource.druid.one.username=root
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=10000
# Druid 数据源 2 配置,继承spring.datasource.druid.* 配置,相同则覆盖
spring.datasource.druid.two.url=jdbc:mysql://127.0.0.1:3306/ms_class
spring.datasource.druid.two.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.two.password=root
spring.datasource.druid.two.username=root
spring.datasource.druid.two.max-active=20
spring.datasource.druid.two.max-wait=20000

添加配置类

package com.example.durid.demo.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.druid.one")
    public DataSource dataSourceOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.two")
    public DataSource dataSourceTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

查看bean信息

"dataSourceOne": {
  "aliases": [],
  "scope": "singleton",
  "type": "com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper",
  "resource": "class path resource [com/example/durid/demo/config/DruidConfiguration.class]",
  "dependencies": [
	"spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties",
	"statFilter"
  ]
},
"dataSourceTwo": {
  "aliases": [],
  "scope": "singleton",
  "type": "com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper",
  "resource": "class path resource [com/example/durid/demo/config/DruidConfiguration.class]",
  "dependencies": [
	"spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties",
	"statFilter"
  ]
}

通过POSTMAN发起操作:http://localhost:8083/user/delete/3

查看数据库:发现数据源的数据被删除

尝试多次执行请求:http://localhost:8083/user/list 每次返回的都是dataSourceOne的数据,因此这种配置没有任何意义,如果要配置一个动态数据源,可考虑使用Spring提供的一个抽象类:org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,实现该类可以在determineCurrentLookupKey方法中动态去选择需要使用的数据源

package com.example.durid.demo.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.List;
import java.util.Random;

/**
 * 随机获取数据源
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);

    private List<String> dataSouceKeyList;

    public List<String> getDataSouceKeyList() {
        return dataSouceKeyList;
    }

    public void setDataSouceKeyList(List<String> dataSouceKeyList) {
        this.dataSouceKeyList = dataSouceKeyList;
    }

    Random random = new Random();

    @Override
    protected Object determineCurrentLookupKey() {
        String key = dataSouceKeyList.get(random.nextInt(dataSouceKeyList.size()));
        logger.info("当前数据源为{}", key);
        return key;
    }
}

添加Bean

package com.example.durid.demo.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Configuration
public class DruidConfiguration {

    @Bean
    @ConfigurationProperties("spring.datasource.druid.one")
    public DataSource dataSourceOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.two")
    public DataSource dataSourceTwo() {
        return DruidDataSourceBuilder.create().build();
    }

    @Primary
    @Bean
    public DataSource dynamicDataSource(@Qualifier("dataSourceOne") DataSource dataSourceOne,
                                        @Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
        Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
        targetDataSources.put("dataSourceOne", dataSourceOne);
        targetDataSources.put("dataSourceTwo", dataSourceTwo);
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(dataSourceTwo);
        List<String> dataSouceKeyList = new ArrayList<String>();
        dataSouceKeyList.add("dataSourceOne");
        dataSouceKeyList.add("dataSourceTwo");
        dynamicDataSource.setDataSouceKeyList(dataSouceKeyList);
        return dynamicDataSource;
    }
}

多次发起查询请求:http://localhost:8083/user/list

查看日志

2020-03-03 16:42:20.977  INFO 12136 --- [nio-8083-exec-2] c.e.durid.demo.config.DynamicDataSource  : 当前数据源为dataSourceOne
2020-03-03 16:42:21.025 DEBUG 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : ==>  Preparing: select id, username, password, money, role, reg_time from user 
2020-03-03 16:42:21.068 DEBUG 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : ==> Parameters: 
2020-03-03 16:42:21.085 TRACE 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : <==    Columns: id, username, password, money, role, reg_time
2020-03-03 16:42:21.086 TRACE 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 1, itmuch, 1111, 3, user, 2020-02-15 14:37:20.0
2020-03-03 16:42:21.090 TRACE 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 2, jack, 1234, 145, user, 2020-02-29 21:27:59.0
2020-03-03 16:42:21.091 TRACE 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 3, king, 1234, 145, vip, 2020-02-29 21:27:59.0
2020-03-03 16:42:21.092 DEBUG 12136 --- [nio-8083-exec-2] c.e.d.demo.mapper.UserMapper.selectAll   : <==      Total: 3
2020-03-03 16:42:29.270  INFO 12136 --- [nio-8083-exec-3] c.e.durid.demo.config.DynamicDataSource  : 当前数据源为dataSourceTwo
2020-03-03 16:42:29.271 DEBUG 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : ==>  Preparing: select id, username, password, money, role, reg_time from user 
2020-03-03 16:42:29.271 DEBUG 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : ==> Parameters: 
2020-03-03 16:42:29.276 TRACE 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : <==    Columns: id, username, password, money, role, reg_time
2020-03-03 16:42:29.276 TRACE 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 2, jack, 1234, 145, user, 2020-02-29 21:27:59.0
2020-03-03 16:42:29.279 TRACE 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 3, king, 1234, 145, vip, 2020-02-29 21:27:59.0
2020-03-03 16:42:29.279 DEBUG 12136 --- [nio-8083-exec-3] c.e.d.demo.mapper.UserMapper.selectAll   : <==      Total: 2
2020-03-03 16:42:33.028  INFO 12136 --- [nio-8083-exec-4] c.e.durid.demo.config.DynamicDataSource  : 当前数据源为dataSourceOne
2020-03-03 16:42:33.029 DEBUG 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : ==>  Preparing: select id, username, password, money, role, reg_time from user 
2020-03-03 16:42:33.029 DEBUG 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : ==> Parameters: 
2020-03-03 16:42:33.031 TRACE 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : <==    Columns: id, username, password, money, role, reg_time
2020-03-03 16:42:33.032 TRACE 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 1, itmuch, 1111, 3, user, 2020-02-15 14:37:20.0
2020-03-03 16:42:33.035 TRACE 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 2, jack, 1234, 145, user, 2020-02-29 21:27:59.0
2020-03-03 16:42:33.036 TRACE 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : <==        Row: 3, king, 1234, 145, vip, 2020-02-29 21:27:59.0
2020-03-03 16:42:33.036 DEBUG 12136 --- [nio-8083-exec-4] c.e.d.demo.mapper.UserMapper.selectAll   : <==      Total: 3

可以看到当前数据源是随机选择的。当然在实际项目中不会这样随意,但是原理都是通过动态数据源根据某些条件返回key值来选择一个数据源。

实现Druid监控

Druid 的监控数据可以在开启 StatFilter 后通过 DruidStatManagerFacade 进行获取,获取到监控数据之后你可以将其暴露给你的监控系统进行使用。Druid 默认的监控系统数据也来源于此。下面给做一个简单的演示,在 Spring Boot 中如何通过 HTTP 接口将 Druid 监控数据以 JSON 的形式暴露出去,实际使用中你可以根据你的需要自由地对监控数据、暴露方式进行扩展。

package com.example.durid.demo.controller;

import com.alibaba.druid.stat.DruidStatManagerFacade;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DruidStatController {
    @GetMapping("/druid/stat")
    public Object druidStat() {
        // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
    }
}

发起请求:http://localhost:8083/druid/index.html
在这里插入图片描述

发布了34 篇原创文章 · 获赞 1 · 访问量 1555

猜你喜欢

转载自blog.csdn.net/m0_37607945/article/details/104636553