Java程序可以通过获取数据库连接对象的日志信息或使用第三方的数据库插件来获取执行的SQL语句。本文将介绍两种常用的方法。

方法一:使用日志获取SQL语句

在Java中,我们可以通过配置数据库连接对象的日志级别,使其输出SQL语句的执行情况。下面以使用Slf4j和Logback为例,演示如何获取执行的SQL语句。

  1. 首先,需要添加Slf4j和Logback的依赖到项目的pom.xml文件中。
```xml
<dependencies>
    ...
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    ...
</dependencies>
  1. 在src/main/resources目录下创建logback.xml文件,并配置日志输出级别为DEBUG,并将输出定向到控制台。
```xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
  1. 在Java代码中获取数据库连接对象,并执行SQL语句。
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;

public class SqlLoggerExample {
    private static final Logger logger = LoggerFactory.getLogger(SqlLoggerExample.class);

    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");

            // 创建Statement对象
            statement = connection.createStatement();

            // 设置日志级别为DEBUG
            logger.debug("SQL statement execution started");

            // 执行SQL语句
            resultSet = statement.executeQuery("SELECT * FROM mytable");

            // 处理查询结果
            while (resultSet.next()) {
                // 获取结果集中的数据
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("id: " + id + ", name: " + name);
            }

            // 设置日志级别为INFO
            logger.info("SQL statement execution completed");
        } catch (SQLException e) {
            logger.error("SQL statement execution failed", e);
        } finally {
            // 关闭资源
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("Failed to close resources", e);
            }
        }
    }
}
  1. 运行程序,可以在控制台或日志文件中看到输出的SQL语句。

方法二:使用第三方数据库插件获取SQL语句

除了使用日志输出,还可以使用第三方的数据库插件来获取执行的SQL语句。下面以使用p6spy插件为例,演示如何获取SQL语句。

  1. 首先,需要添加p6spy的依赖到项目的pom.xml文件中。
```xml
<dependencies>
    ...
    <dependency>
        <groupId>p6spy</groupId>
        <artifactId>p6spy</artifactId>
        <version>3.0.0</version>
    </dependency>
    ...
</dependencies>
  1. 在src/main/resources目录下创建spy.properties文件,并配置数据库连接信息。
```properties
driverlist=com.mysql.jdbc.Driver
deregisterdrivers=true
appender=com.p6spy.engine.spy.appender.StdoutLogger
logfile=spy.log
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|connectionId|%(sqlSingleLine)
  1. 在Java代码中获取数据库连接对象,并执行SQL语句。
```java
import java.sql.*;

public class P6SpyExample {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 获取数据库连接
            connection = DriverManager.getConnection("jdbc:p6spy:mysql://localhost:3306