📜  Apache Commons DBUtils教程(1)

📅  最后修改于: 2023-12-03 15:13:25.586000             🧑  作者: Mango

Apache Commons DBUtils 教程

Apache Commons DBUtils 是一个用于简化 JDBC 编程的 JDBC 工具包。它是基于普通的 JDBC API 构建的,并对其进行了简单的封装和扩展。DBUtils 是 Apache Commons 项目的一部分,因此它也是一个开源项目。

特点

DBUtils 为 JDBC 编程提供了许多便利功能,包括:

  • 简化了打开和关闭连接的代码,同时也简化了异常处理代码。
  • 将执行 SQL 语句、处理 ResultSet 和处理异常的代码进一步封装,并提供了更方便的方式进行数据的访问。
  • 提供了一些常见的实用方法,如将获取的 ResultSet 转换为 List、Map 等。
  • 提供了事务支持。
安装

DBUtils 可以从它们的官方网站下载(地址:https://commons.apache.org/proper/commons-dbutils/)

你也可以使用 Maven,将以下依赖项添加到 pom.xml 文件中:

<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.7</version>
</dependency>
使用DBUtils

主要代码格式:

1.创建连接对象
private static QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
2.实现ResultSetHandler接口
public interface ResultSetHandler<T> {

    T handle(ResultSet rs) throws SQLException;

}
3.增
public int insert(String sql, Object... params) throws SQLException {
        return runner.update(sql, params);
}
4.删
public int delete(String sql, Object... params) throws SQLException {
    return runner.update(sql, params);
}
5.改
public int update(String sql, Object... params) throws SQLException {
    return runner.update(sql, params);
}
6.查
public <T>T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
    return runner.query(sql, rsh, params);
}
范例

下面会使用姓名和密码来模拟用户的信息。

1.创建一个User类
public class User {
    private String name;
    private String password;
    //省略...
}
2.实现ResultSetHandler
public class UserResultSetHandler<T> implements ResultSetHandler<User> {
    @Override
    public User handle(ResultSet rs) throws SQLException {
        if(rs.next()) {
            User user = new User();
            user.setName(rs.getString("name"));
            user.setPassword(rs.getString("password"));

            return user;
        }

        return null;
    }
}
3.测试代码

下面是一个完整的测试代码:

public class DBUtilsTest {
    private static QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());

    /**
     * 获取用户信息
     * @param name
     * @param password
     * @return User
     */
    public static User getUser(String name, String password) {
        String sql = "SELECT * FROM dbtest.user WHERE name=? AND password=?";

        try {
            return runner.query(sql, new UserResultSetHandler<>(), name, password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 新增用户
     * @param name
     * @param password
     * @return boolean
     */
    public static boolean insertUser(String name, String password) {
        String sql = "INSERT INTO dbtest.user (name, password) VALUES(?, ?)";

        try {
            int result = runner.update(sql, name, password);

            return result > 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 删除用户
     * @param name
     * @param password
     * @return boolean
     */
    public static boolean deleteUser(String name, String password) {
        String sql = "DELETE FROM dbtest.user WHERE name=? AND password=?";

        try {
            int result = runner.update(sql, name, password);

            return result > 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 更新用户
     * @param name
     * @param password
     * @return boolean
     */
    public static boolean updateUser(String name, String password) {
        String sql = "UPDATE dbtest.user SET password=? WHERE name=?";

        try {
            int result = runner.update(sql, password, name);

            return result > 0;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        String name = "test";
        String password = "123456";

        //新增用户
        System.out.println(insertUser(name, password));

        //获取用户信息
        User user = getUser(name, password);
        System.out.println(user.getName() + " - " + user.getPassword());

        //更新用户
        System.out.println(updateUser(name, "654321"));

        //获取用户信息
        User user1 = getUser(name, "654321");
        System.out.println(user1.getName() + " - " + user1.getPassword());

        //删除用户
        System.out.println(deleteUser(name, "654321"));
    }
}
结论

Apache Commons DBUtils 是一个非常实用的 JDBC 工具包,它可以大大简化 Java 程序员的 JDBC 编程。虽然使用 DBUtils 可能会牺牲一些灵活性,但是相对于手动编写 JDBC 代码,使用 DBUtils 编写的代码更易于维护和理解,并且更加可靠。