druid 是支持 打印完整可以执行SQL的,只是 druid 默认不会打印。这点我觉得做得不够友好。这么好用的功能,居然默认隐藏 ?

spring boot 配置

引入依赖

com.alibaba

druid-spring-boot-starter

1.2.4

配置文件配置

logging.level.druid.sql.Statement=debug

spring.datasource.druid.filter.slf4j.enabled=true

spring.datasource.druid.filter.slf4j.statementPrepareAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementCreateAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementExecuteQueryAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementExecuteAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementParameterSetLogEnabled=false

spring.datasource.druid.filter.slf4j.statementCloseAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementExecuteBatchAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementExecuteUpdateAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementPrepareCallAfterLogEnabled=false

spring.datasource.druid.filter.slf4j.statementExecutableSqlLogEnable=true

spring.datasource.druid.filter.slf4j.statementLogEnabled=true

其实关键是 下面的两个配置

spring.datasource.druid.filter.slf4j.statementExecutableSqlLogEnable=true

spring.datasource.druid.filter.slf4j.statementLogEnabled=true

其他也设置为 false 是因为 会 打印其他 SQL log 太多了。

参考 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

druid 自定义 配置

引入依赖

com.alibaba

druid

${druid.version}

log2 文件配置

配置类

package com.door.config;

import com.alibaba.druid.filter.Filter;

import com.alibaba.druid.filter.logging.Log4j2Filter;

import com.alibaba.druid.filter.stat.StatFilter;

import com.alibaba.druid.pool.DruidDataSource;

import com.alibaba.druid.support.http.StatViewServlet;

import com.alibaba.druid.support.http.WebStatFilter;

import com.alibaba.druid.wall.WallConfig;

import com.alibaba.druid.wall.WallFilter;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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.util.ArrayList;

import java.util.List;

/**

* @author Cheng JiYe

* @description:

* @date 2020/9/9 16:51

*/

@Configuration

public class DruidConfiguration {

private Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

@Value("${spring.datasource.url}")

private String dbUrl;

@Value("${spring.datasource.username}")

private String username;

@Value("${spring.datasource.password}")

private String password;

@Value("${spring.datasource.driver-class-name}")

private String driverClassName;

@Value("${spring.datasource.initialSize}")

private int initialSize;

@Value("${spring.datasource.minIdle}")

private int minIdle;

@Value("${spring.datasource.maxActive}")

private int maxActive;

@Value("${spring.datasource.maxWait}")

private int maxWait;

@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")

private int timeBetweenEvictionRunsMillis;

@Value("${spring.datasource.minEvictableIdleTimeMillis}")

private int minEvictableIdleTimeMillis;

@Value("${spring.datasource.validationQuery}")

private String validationQuery;

@Value("${spring.datasource.testWhileIdle}")

private boolean testWhileIdle;

@Value("${spring.datasource.testOnBorrow}")

private boolean testOnBorrow;

@Value("${spring.datasource.testOnReturn}")

private boolean testOnReturn;

@Value("${spring.datasource.poolPreparedStatements}")

private boolean poolPreparedStatements;

@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")

private int maxPoolPreparedStatementPerConnectionSize;

// @Value("${spring.datasource.filters}")

//private String filters;

// @Value("${spring.datasource.connectionProperties}")

//private String connectionProperties;

@Bean // 声明其为Bean实例

@Primary // 在同样的DataSource中,首先使用被标注的DataSource

public DataSource dataSource() {

DruidDataSource datasource = new DruidDataSource();

datasource.setUrl(this.dbUrl);

datasource.setUsername(this.username);

datasource.setPassword(this.password);

datasource.setDriverClassName(this.driverClassName);

// configuration

datasource.setInitialSize(this.initialSize);

datasource.setMinIdle(this.minIdle);

datasource.setMaxActive(this.maxActive);

datasource.setMaxWait(this.maxWait);

datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);

datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);

datasource.setValidationQuery(this.validationQuery);

datasource.setTestWhileIdle(this.testWhileIdle);

datasource.setTestOnBorrow(this.testOnBorrow);

datasource.setTestOnReturn(this.testOnReturn);

datasource.setPoolPreparedStatements(this.poolPreparedStatements);

datasource.setMaxPoolPreparedStatementPerConnectionSize(

this.maxPoolPreparedStatementPerConnectionSize);

// 添加自定义的filter

datasource.setProxyFilters(this.proxyFilters());

// 可以通过一串内容来配置数据源属性,这里不需要了.不要用错了

// datasource.setConnectionProperties(this.connectionProperties);

// #druid recycle Druid的连接回收机制 . 别乱加,一般出问题的时候,调试用

// datasource.setRemoveAbandoned(true);// 超过时间是否回收

// datasource.setRemoveAbandonedTimeout(120); // 秒

// datasource.setLogAbandoned(true);

// 连接时指定编码,防止中文乱码,与特殊字符和表情不能存入数据库

List initSql = new ArrayList<>();

initSql.add("set names utf8mb4;");

datasource.setConnectionInitSqls(initSql);

return datasource;

}

private List proxyFilters() {

List filters = new ArrayList<>(3);

filters.add(this.logFilter());

filters.add(this.statFilter());

filters.add(this.wallFilter());

return filters;

}

/**

* http://localhost:8080/druid/login.html 注册一个StatViewServlet

*

* @return

*/

@Bean

public ServletRegistrationBean DruidStatViewServle() {

// org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.

ServletRegistrationBean servletRegistrationBean =

new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

// 添加初始化参数:initParams

// 白名单:

// servletRegistrationBean.addInitParameter("allow","127.0.0.1");

// IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.

// servletRegistrationBean.addInitParameter("deny","192.168.1.73");

// 登录查看信息的账号密码.

servletRegistrationBean.addInitParameter("loginUsername", "admin");

servletRegistrationBean.addInitParameter("loginPassword", "123456Auth");

// 是否能够重置数据.

servletRegistrationBean.addInitParameter("resetEnable", "false");

return servletRegistrationBean;

}

/**

* 注册一个:filterRegistrationBean

*

* @return

*/

@Bean

public FilterRegistrationBean druidStatFilter() {

FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

// 添加过滤规则.

filterRegistrationBean.addUrlPatterns("/*");

// 添加不需要忽略的格式信息.

filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,");

return filterRegistrationBean;

}

/**

* 定义 log 过滤

*

* @return

*/

private Log4j2Filter logFilter() {

Log4j2Filter logFilter = new Log4j2Filter();

logFilter.setStatementLogEnabled(true);

// 不要创建后 log

logFilter.setStatementCreateAfterLogEnabled(false);

// 不要 关闭后 log

logFilter.setStatementCloseAfterLogEnabled(false);

// 不要参数 log

logFilter.setStatementParameterClearLogEnable(false);

logFilter.setStatementParameterSetLogEnabled(false);

logFilter.setStatementPrepareAfterLogEnabled(false);

logFilter.setStatementPrepareCallAfterLogEnabled(false);

// 不要执行之后的log

logFilter.setStatementExecuteAfterLogEnabled(false);

logFilter.setStatementExecuteBatchAfterLogEnabled(false);

logFilter.setStatementExecuteQueryAfterLogEnabled(false);

logFilter.setStatementExecuteUpdateAfterLogEnabled(false);

// 可以打印完整的SQL

logFilter.setStatementExecutableSqlLogEnable(true);

return logFilter;

}

/**

* 自定义统计 SQL

*

* @return

*/

private StatFilter statFilter() {

StatFilter statFilter = new StatFilter();

// 统计慢查询

statFilter.setSlowSqlMillis(5000);

statFilter.setLogSlowSql(true);

statFilter.setMergeSql(true);

return statFilter;

}

/**

* sql防火墙过滤器配置

*

* @return

*/

private WallFilter wallFilter() {

WallFilter wallFilter = new WallFilter();

wallFilter.setConfig(this.wallConfig());

wallFilter.setLogViolation(true); // 对被认为是攻击的SQL进行LOG.error输出

wallFilter.setThrowException(false); // 对被认为是攻击的SQL抛出SQLException

return wallFilter;

}

/**

* sql防火墙配置

*

* @return

*/

private WallConfig wallConfig() {

WallConfig wallConfig = new WallConfig();

// wallConfig.setDeleteAllow(false); // 不可以删除全部

return wallConfig;

}

}

关闭 mybatis log 打印

以上 druid 配置好了之后,其实也就不需要 mybtis 配置打印 SQL了

也不需要 使用 啥 mybatis log plugin 等等 此类方式来获取完整的可以执行SQL了

configuration:

map-underscore-to-camel-case: true # 是否开启自动驼峰命名规则(camel case)映射

cache-enabled: false #配置的缓存的全局开关

#配置JdbcTypeForNull

jdbc-type-for-null: 'null'

lazy-loading-enabled: true #延时加载的开关. 默认false

# 不需要mybatis记录 sql log

log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

参考资料

https://www.bookstack.cn/read/Druid/4e582ac4d22e5709.md

https://www.bookstack.cn/read/Druid/f8a2f69d3df5ead2.md

druid定义 java使用_druid 配置打印完整可执行的SQL相关推荐

  1. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  2. Druid连接池的实用配置详解

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  3. 记录druid整合springboot+logback配置打印sql日志

    [记录druid整合springboot+logback配置打印sql日志] 整合记录 整合记录 首先看 druid 的LogFilter 为我们准备的四种logger类型 这些logger分别对应打 ...

  4. mybatis-plus配置控制台打印完整带参数SQL语句

    问题背景 通常我们开发的时候,需要联合控制台和Navicat/PLSQL等工具进行语句的拼接检查,如果只是输出了一堆???,那么将极大降低我们的效率.因此我们需要输出完整的SQL语句以便调试. Upd ...

  5. druid mysql配置详解_druid配置详解

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...

  6. Java打印完整的堆栈信息

    Java print full StackTrace 我们在编写一些组件时,使用的日志系统有时并不能打印完整的堆栈信息,比如slf4j,log4j,我们在调用log.error("found ...

  7. springboot使用p6spy打印完整SQL

    springboot使用p6spy打印完整SQL pom 平常使用orm框架的时候,虽然在spring boot配置文件上面配置过orm的打印sql语句之后,并不会真正打印出完整的sql pom &l ...

  8. java SpringWeb如何实现打印日志

    今天后台调试,调用后台接口却发现没有把日志打印出来 于是开始配置打印日志 1.导入log4j的jar import org.apache.log4j.Logger; 2.配置log4j.propert ...

  9. TwoRavens配置的完整过程及异常处理方法

    TwoRavens配置的完整过程及异常处理方法 TowRavens是开源项目Dataverse用到的数据可视化统计的API, 其主界面很简单,就是一个html,数据的可视化实现依赖javascript ...

最新文章

  1. Nginx与websocket或socketio的负载均衡
  2. python 保留两位小数 实现方法
  3. 深度解密Go语言之sync.map
  4. 使用jMeter构造逻辑上有依赖关系的一系列并发请求
  5. java 死锁 解决_Java死锁故障排除和解决
  6. 网页空间 - 概念篇
  7. zendstudio的安装与配置
  8. Javascript 四种输出方式
  9. ps怎么打开php图片大小,如何使用ps修改图片尺寸
  10. CMS漏洞(发货100CMS、SHECMS、ZHCMS、MACCMS)详解实战
  11. 编译MTK系统源码时checking Env失败的解决方法
  12. 为什么ios比android流畅
  13. weevely生成木马文件上传获取靶机中的flag文件
  14. html style
  15. Tether操纵市场了吗?
  16. 利用supervisor对服务进行管理
  17. python基础-廖雪峰
  18. Python Selenium爬虫实现歌曲免费下载
  19. 生成自定义时长的静音音频 | Java工具类
  20. 【计算机网络】HTTP协议中Get与Post的区别

热门文章

  1. 摄影 闪光灯同步(前帘同步,后帘同步,后期堆栈)
  2. HBase--分布式非关系型数据库HBase入门精讲(侧重原理)
  3. 达人评测 i7 12700H和i9 12900HK选哪个好
  4. 个人写作--瞿同祖及其学术研究视角
  5. Android遇上打印机
  6. 仿酷狗音乐播放器开发日志七——播放列表的实现二
  7. android莫名其妙打开支付宝,【未解决】用uiautomator2实现安卓手机打开支付宝自动收集蚂蚁森林能量...
  8. shell蚂蚁森林_Shell脚本实现光速联自动提速
  9. Linux-4412用汇编程序控制寄存器R0、R1、R2实现KED亮灭
  10. mac vim设置配色