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监控
输入上面配置的用户名密码
数据源情况
SQL监控
SQL防火墙
URL监控