《Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。
环境:SpringBoot3.2.5
1. 简介
不论是处于开发阶段还是线上运行环境,SQL日志记录是调试、监控和优化数据库操作的重要手段。尽管有许多第三方框架和工具提供了强大的日志记录功能,但在某些情况下,我们可能需要自定义SQL日志记录以满足特定需求。自定义SQL日志记录功能允许开发者精确控制日志的格式、内容以及存储方式,从而更灵活地应对各种开发场景。
通过实现自定义SQL日志记录,我们可以记录每次数据库操作的详细信息,包括执行的SQL语句、执行时间、参数值等。这些信息对于排查问题、优化性能以及审计数据库操作都非常有价值。
本文将介绍如何在不使用任何第三方框架的情况下,实现SQL的日志记录功能。
在实现自定义的SQL记录功能之前,我们假设读者已经具备了一定的JDBC编程基础。JDBC是Java平台提供的用于连接和操作数据库的一套API,它使得Java应用程序能够与多种数据库进行交互。了解JDBC的基本概念和常用操作,如建立数据库连接、执行SQL语句以及处理结果集等,对于理解和实现自定义SQL记录功能至关重要。因此,请确保你已经熟悉了JDBC编程的相关知识,以便更好地跟随本文的讲解和示例。下面是使用JDBC执行SQL的示例:
// 数据库连接信息private static final String DB_URL = "jdbc:mysql://localhost:3306/big_data";private static final String USERNAME = "root" ;private static final String PASSWORD = "xxxooo" ;public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {// 1. 注册JDBC驱动(这一步在新版本的JDBC中通常可以省略)// Class.forName("com.mysql.cj.jdbc.Driver");// 2. 打开连接conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);// 3. 执行查询操作String querySQL = "SELECT id, name, age FROM users WHERE id = ?";pstmt = conn.prepareStatement(querySQL);// 设置参数,查询id为1的用户pstmt.setInt(1, 1) ;// 执行查询操作rs = pstmt.executeQuery() ;// 处理结果集while (rs.next()) {int id = rs.getInt("id") ;String name = rs.getString("name") ;int age = rs.getInt("age") ;System.out.printf("ID: %s, Name: %s, Age: %s%n", id, name, age) ;}// 4. 执行修改操作(更新)String updateSQL = "UPDATE users SET age = ? WHERE id = ?";pstmt = conn.prepareStatement(updateSQL) ;// 设置占位符pstmt.setInt(1, 25) ;pstmt.setInt(2, 1) ;// 执行更新操作pstmt.executeUpdate() ;// 5.关闭资源}}
以上是一个简化的示例,展示了如何通过JDBC进行基本的数据库编程任务,如编写SQL语句、设置参数以及处理返回结果。
基于上述内容,接下来我们将逐步实现SQL记录功能。我们会按照如下的步骤实现:
在Spring Boot项目中自定义一个HikariDataSource
创建并自定义一个Connection类,通过自定义的Connection实现SQL的记录
代理默认PreparedStatement,以便记录SQL执行的参数及SQL执行耗时情况
接下来我们将按照上面3个步骤实现SQL日志的记录功能。
2. 实战案例
2.1 自定义数据源
从Spring Boot 2开始,默认的数据源是HikariCP。当我们自定义了一个DataSource并将其定义为Spring容器中的一个Bean时,Spring Boot将会优先使用我们自定义的这个数据源Bean,而不是默认的HikariCP数据源。


