依赖准备

在使用 DbUtils 之前,确保项目已经配置了所需的 JDBC 驱动。例如,如果连接的是 MySQL 数据库,可以在 Maven 项目中的 pom.xml 中添加以下依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

DbUtils 工具类实现

package com.example.utils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * DbUtils 工具类
 * 提供常见的数据库操作方法
 */
public class DbUtils {

    private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database";
    private static final String DB_USER = "your_username";
    private static final String DB_PASSWORD = "your_password";

    // 加载数据库配置,最好通过配置文件加载
    static {
        try {
            // 注册 JDBC 驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     *
     * @return 数据库连接对象
     * @throws SQLException SQL 异常
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
    }

    /**
     * 关闭数据库资源
     *
     * @param conn 数据库连接
     * @param stmt SQL 语句
     * @param rs   结果集
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行查询操作
     *
     * @param sql    SQL 查询语句
     * @param params 查询参数
     * @return 查询结果列表,每个结果是一个包含列名-列值对的 Map
     * @throws SQLException SQL 异常
     */
    public static List<List<Object>> executeQuery(String sql, Object... params) throws SQLException {
        List<List<Object>> results = new ArrayList<>();
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 设置参数
            setParameters(pstmt, params);

            try (ResultSet rs = pstmt.executeQuery()) {
                int columnCount = rs.getMetaData().getColumnCount();
                while (rs.next()) {
                    List<Object> row = new ArrayList<>();
                    for (int i = 1; i <= columnCount; i++) {
                        row.add(rs.getObject(i));
                    }
                    results.add(row);
                }
            }
        }
        return results;
    }

    /**
     * 执行更新操作(INSERT, UPDATE, DELETE)
     *
     * @param sql    SQL 更新语句
     * @param params 更新参数
     * @return 受影响的行数
     * @throws SQLException SQL 异常
     */
    public static int executeUpdate(String sql, Object... params) throws SQLException {
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 设置参数
            setParameters(pstmt, params);

            return pstmt.executeUpdate();
        }
    }

    /**
     * 执行批量更新操作
     *
     * @param sql    SQL 更新语句
     * @param params 参数列表,每个元素是一个参数数组
     * @return 受影响的行数数组
     * @throws SQLException SQL 异常
     */
    public static int[] executeBatchUpdate(String sql, List<Object[]> params) throws SQLException {
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            for (Object[] paramSet : params) {
                setParameters(pstmt, paramSet);
                pstmt.addBatch();
            }

            return pstmt.executeBatch();
        }
    }

    /**
     * 设置 PreparedStatement 的参数
     *
     * @param pstmt  PreparedStatement 对象
     * @param params 参数数组
     * @throws SQLException SQL 异常
     */
    private static void setParameters(PreparedStatement pstmt, Object... params) throws SQLException {
        if (params != null) {
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }
        }
    }

    /**
     * 执行事务操作
     *
     * @param transaction 事务逻辑
     * @throws SQLException SQL 异常
     */
    public static void executeTransaction(Transaction transaction) throws SQLException {
        Connection conn = null;
        try {
            conn = getConnection();
            conn.setAutoCommit(false); // 开始事务
            transaction.run(conn);
            conn.commit(); // 提交事务
        } catch (SQLException e) {
            if (conn != null) {
                conn.rollback(); // 回滚事务
            }
            throw e;
        } finally {
            close(conn, null, null);
        }
    }

    /**
     * 事务接口
     */
    @FunctionalInterface
    public interface Transaction {
        void run(Connection conn) throws SQLException;
    }
}

主要功能简介

  1. 获取数据库连接

    • getConnection:获取数据库连接对象,用于执行 SQL 操作。
  2. 关闭数据库资源

    • close:关闭数据库连接、语句、结果集等资源,避免资源泄漏。
  3. 执行查询操作

    • executeQuery:执行 SQL 查询语句,返回查询结果列表。
  4. 执行更新操作

    • executeUpdate:执行 SQL 更新语句,如 INSERT、UPDATE、DELETE,返回受影响的行数。
  5. 批量更新操作

    • executeBatchUpdate:执行批量 SQL 更新操作,返回每次执行的结果数组。
  6. 设置 SQL 参数

    • setParameters:设置 SQL 语句的参数,用于 PreparedStatement。
  7. 执行事务操作

    • executeTransaction:执行带事务的操作,通过事务接口传递逻辑,支持事务的提交和回滚。

使用示例

import com.example.utils.DbUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

public class DbUtilsTest {
    public static void main(String[] args) {
        String querySql = "SELECT * FROM users WHERE age > ?";
        String updateSql = "UPDATE users SET age = ? WHERE name = ?";
        String insertSql = "INSERT INTO users (name, age) VALUES (?, ?)";

        try {
            // 执行查询操作
            List<List<Object>> results = DbUtils.executeQuery(querySql, 25);
            for (List<Object> row : results) {
                System.out.println(row);
            }

            // 执行更新操作
            int rowsUpdated = DbUtils.executeUpdate(updateSql, 30, "John");
            System.out.println("Rows updated: " + rowsUpdated);

            // 执行批量更新操作
            List<Object[]> batchParams = Arrays.asList(
                    new Object[]{"Alice", 28},
                    new Object[]{"Bob", 34}
            );
            int[] batchResults = DbUtils.executeBatchUpdate(insertSql, batchParams);
            System.out.println("Batch update results: " + Arrays.toString(batchResults));

            // 执行事务操作
            DbUtils.executeTransaction(conn -> {
                DbUtils.executeUpdate(insertSql, "Charlie", 40);
                DbUtils.executeUpdate(insertSql, "Dave", 22);
            });
            System.out.println("Transaction completed successfully.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

结论

DbUtils 工具类通过封装 JDBC 提供的数据库操作功能,简化了数据库连接管理、查询执行、数据更新等常见操作。该工具类支持事务操作,可以通过传入自定义的事务逻辑,方便地进行事务管理。这些方法提高了代码的可读性,减少了重复代码的编写,使得数据库操作更加简洁和高效。DbUtils 是一个非常实用的工具类,适用于各种 Java 应用程序中的数据库操作。

总结

 Java数据库操作工具类是一种用于简化数据库操作的工具,常见的工具类有DbUtils和SqlUtils。

DbUtils是Apache Commons项目中的一个工具类库,提供了一系列静态方法来执行各种数据库操作。它可以帮助开发人员简化数据库操作的代码,提高开发效率。DbUtils主要提供了以下功能:

  1. 数据库连接管理:DbUtils可以帮助开发人员管理数据库连接,包括连接的创建、释放和管理。

  2. SQL执行:DbUtils提供了执行SQL语句的方法,可以执行各种类型的SQL语句,包括查询、更新、删除等。

  3. 数据库事务管理:DbUtils可以帮助开发人员管理数据库的事务,包括事务的提交和回滚。

  4. SQL查询结果处理:DbUtils提供了处理SQL查询结果的方法,可以将查询结果转换为Java对象或集合。

SqlUtils是一个简单的数据库操作工具类,提供了一些简单的方法来执行SQL语句。它的功能相对较少,主要包括以下几点:

  1. 数据库连接管理:SqlUtils可以帮助开发人员管理数据库连接,包括连接的创建、释放和管理。

  2. SQL执行:SqlUtils提供了执行SQL语句的方法,可以执行各种类型的SQL语句,包括查询、更新、删除等。

  3. SQL查询结果处理:SqlUtils提供了处理SQL查询结果的方法,可以将查询结果转换为Java对象或集合。

DbUtils和SqlUtils都是开源的工具类库,可以通过引入相应的jar包来使用。它们都可以在Java项目中简化数据库操作,提高开发效率,但DbUtils提供的功能更为丰富一些。选择使用哪个工具类取决于具体的需求和项目的规模。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐