1.概述

我们在使用 springboot3 的时候,我们需要使用 druid 作为我们的数据源.由于 Spring Boot 3 基于 Jakarta EE 9+(包名从 javax.* 变为 jakarta.*),而 Druid 官方对 Spring Boot 3 的支持在较新版本中才完善(建议使用 Druid 1.2.16+)。

2.使用过程

2.1 创建一个springboot项目

增加依赖如下:

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

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.33</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.27</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.8</version>
        </dependency>

2.2 增加配置代码

package com.redxun.druiddemo.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.jakarta.StatViewServlet;
import com.alibaba.druid.support.jakarta.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class DruidConfig {

    @Value("${app.datasource.name}")
    private String name;

    @Value("${app.datasource.url}")
    private String dbUrl;

    @Value("${app.datasource.username}")
    private String username;

    @Value("${app.datasource.password}")
    private String password;

    @Value("${app.datasource.driver-class-name}")
    private String driverClassName;

    // 监控登录账号
    @Value("${druid.login.username:admin}")
    private String druidLoginUsername;

    @Value("${druid.login.password:admin123}")
    private String druidLoginPassword;

    /**
     * 手动创建 Druid 数据源,并集成 WallFilter(SQL 防火墙)
     */
    @Bean
    @Primary
    public DataSource dataSource() throws SQLException {
        DruidDataSource datasource = new DruidDataSource();

        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);

        // 基础连接池配置
        datasource.setInitialSize(5);
        datasource.setMinIdle(5);
        datasource.setMaxActive(20);
        datasource.setMaxWait(60000);
        datasource.setTimeBetweenEvictionRunsMillis(60000);
        datasource.setMinEvictableIdleTimeMillis(300000);
        datasource.setValidationQuery("SELECT 1");
        datasource.setTestWhileIdle(true);
        datasource.setTestOnBorrow(false);
        datasource.setTestOnReturn(false);

        WallFilter wallFilter = wallFilter();  // 使用你自定义配置的WallFilter
        wallFilter.setDbType("mysql");
        datasource.setProxyFilters(java.util.Arrays.asList(wallFilter));


        // 启用监控统计(StatFilter)
        datasource.setFilters("stat"); // 等价于添加 StatFilter

        datasource.setName("dataSource-" + name );
        datasource.init();

        return datasource;
    }

    /**
     * 配置 SQL 防火墙(WallFilter)
     */
    @Bean
    public WallFilter wallFilter() {
        WallFilter wallFilter = new WallFilter();
        WallConfig config = new WallConfig();
        config.setDropTableAllow(false);        // 禁止删除表
        config.setTruncateAllow(false);         // 禁止 truncate
        config.setAlterTableAllow(false);       // 禁止 alter table
        config.setMultiStatementAllow(false);   // 禁止多语句(防注入)
        config.setUpdateAllow(true);            // 允许 update(按需调整)
        wallFilter.setConfig(config);
        return wallFilter;
    }

    /**
     * 注册 Druid 监控页面 Servlet(StatViewServlet)
     */
    @Bean
    public ServletRegistrationBean statViewServletRegistrationBean() {

        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.setServlet(new StatViewServlet());
        registrationBean.addUrlMappings( "/druid/*");
        registrationBean.addInitParameter("loginUsername", druidLoginUsername);
        registrationBean.addInitParameter("loginPassword", druidLoginPassword);
        registrationBean.addInitParameter("resetEnable", "true");

        return registrationBean;
    }

    /**
     * 注册 Web 请求统计 Filter(WebStatFilter)
     */
    @Bean
    public FilterRegistrationBean<WebStatFilter> druidWebStatFilter() {
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean =
                new FilterRegistrationBean<>();

        WebStatFilter webStatFilter = new WebStatFilter();
        filterRegistrationBean.setFilter(webStatFilter);

        filterRegistrationBean.addUrlPatterns("/*");

        // 排除静态资源和监控路径
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        filterRegistrationBean.addInitParameter("sessionStatMaxCount", "1000");
        filterRegistrationBean.addInitParameter("sessionStatEnable", "true");

        return filterRegistrationBean;
    }



}

这里增加统计servelt ,和web防火墙。

2.3 对数据库进行操作

2.3.1 创建用户表

create table user (id varchar(50) PRIMARY key ,name varchar(50))

2.3.2 增加实体对象

@Data
public class User {
    private String id;
    private String name;
}

2.3.3 增加mppper 接口

@Mapper
public interface UserMapper extends BaseMapper<User> {

    void truncateTable();

    void dropTable();
}

2.3.4 增加控制器


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

    @Resource
    private UserMapper userMapper;

    @RequestMapping("/get")
    public User get(@RequestParam("id") String id) {
        return userMapper.selectById(id);
    }

    @RequestMapping("/add")
    public User add(@RequestParam("name") String name) {
        User user = new User();
        String id= UUID.randomUUID().toString();
        user.setId(id);
        user.setName(name);
        userMapper.insert(user);
        return user;
    }

    @RequestMapping("/truncate")
    public String truncate() {
        userMapper.truncateTable();
        return "ok";
    }

    @RequestMapping("/droptable")
    public String droptable() {
        userMapper.dropTable();
        return "ok";
    }
}

2.3.5 增加 mpper.xml

在application.yml 增加配置

mybatis:
  mapper-locations: classpath*:mapper/*.xml

mapper.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.redxun.druiddemo.mapper.UserMapper">
    <!-- 其他 SQL 语句 -->

    <update id="truncateTable">
        TRUNCATE TABLE user
    </update>

    <update id="dropTable">
        DROP TABLE user
    </update>
</mapper>

2.3.6 applicaiton.yml的配置

app:
  datasource:
    name: demo1
    url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

druid:
  login:
    username: admin
    password: admin

2.4 查看监控

http://localhost:9999/druid/index.html

我们可以通过这个访问 druid监控
输入上面配置的用户名密码

数据源情况
image

SQL监控
image

SQL防火墙

image

URL监控

image

posted on 2025-09-26 17:14  自由港  阅读(24)  评论(0)    收藏  举报