📜  Apache Commons DBUtils-阅读查询(1)

📅  最后修改于: 2023-12-03 14:59:20.208000             🧑  作者: Mango

Apache Commons DBUtils-阅读查询

Apache Commons DBUtils是Apache基金会提供的一个流行的开源Java库,用于简化和增强JDBC编程。它提供了一组简单易用、可扩展的JDBC实用程序,帮助开发人员编写数据库访问代码。DBUtils是轻量级的,不依赖于任何第三方框架,可以方便地集成到任何现有项目中。

DBUtils提供了以下便利API:

  • QueryRunner:提供了执行SQL查询语句的方法,具有很好的可扩展性和可插拔性,方便进行统计分析和报表生成。
  • ResultSetHandler:提供了将JDBC结果集转换为Java对象和Java对象集合的方法,以及处理LOB和BLOB等复杂数据类型的方法。
  • BasicDataSource:提供了一种简单实用的数据源类,支持数据库连接池机制和常见的数据库连接属性配置。
QueryRunner

QueryRunner是DBUtils中最常用的API之一,用于执行SQL查询语句,并将查询结果转换为Java对象或Java对象集合。QueryRunner基于JDBC的PreparedStatement实现,可以安全地防止SQL注入攻击。QueryRunner提供了以下方法:

query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)

执行SQL查询语句,并将查询结果转换为Java对象。参数conn指定数据库连接,参数sql指定SQL查询语句,参数rsh指定结果集处理器,参数params指定查询参数。方法返回值为T类型。

try (Connection conn = getDBConnection()) {
    QueryRunner qr = new QueryRunner();
    List<Customer> customers = qr.query(conn, "SELECT * FROM customers WHERE age > ?", new BeanListHandler<>(Customer.class), 18);
    for (Customer customer : customers) {
        System.out.println(customer);
    }
} catch (SQLException ex) {
    ex.printStackTrace();
}
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object[] params)

执行SQL查询语句,并将查询结果转换为Java对象。参数conn指定数据库连接,参数sql指定SQL查询语句,参数rsh指定结果集处理器,参数params指定查询参数。方法返回值为T类型。

try (Connection conn = getDBConnection()) {
    QueryRunner qr = new QueryRunner();
    Customer customer = qr.query(conn, "SELECT * FROM customers WHERE customer_id = ?", new BeanHandler<>(Customer.class), "C001");
    System.out.println(customer);
} catch (SQLException ex) {
    ex.printStackTrace();
}
query(Connection conn, String sql, ResultSetHandler<T> rsh)

执行SQL查询语句,并将查询结果转换为Java对象集合。参数conn指定数据库连接,参数sql指定SQL查询语句,参数rsh指定结果集处理器。方法返回值为T类型。

try (Connection conn = getDBConnection()) {
    QueryRunner qr = new QueryRunner();
    List<Customer> customers = qr.query(conn, "SELECT * FROM customers", new BeanListHandler<>(Customer.class));
    for (Customer customer : customers) {
        System.out.println(customer);
    }
} catch (SQLException ex) {
    ex.printStackTrace();
}
update(Connection conn, String sql, Object... params)

执行SQL更新语句,返回受影响的行数。参数conn指定数据库连接,参数sql指定SQL更新语句,参数params指定更新参数。

try (Connection conn = getDBConnection()) {
    QueryRunner qr = new QueryRunner();
    int n = qr.update(conn, "UPDATE customers SET age = ? WHERE customer_id = ?", 20, "C001");
    System.out.printf("Updated %d rows.%n", n);
} catch (SQLException ex) {
    ex.printStackTrace();
}
ResultSetHandler

ResultSetHandler是DBUtils中用于将JDBC结果集转换为Java对象或Java对象集合的API,用于简化访问JDBC结果集的过程。ResultSetHandler提供了以下实现类:

  • ArrayHandler:将结果集的第一行转换为对象数组。
  • ArrayListHandler:将结果集转换为ArrayList,每一行为一个对象数组。
  • BeanHandler:将结果集的第一行转换为Java对象。
  • BeanListHandler:将结果集转换为Java对象集合。
  • ColumnListHandler:将结果集的一列转换为对象集合。
  • KeyedHandler:将结果集转换为带有Key-Value键值对的Map。
  • MapHandler:将结果集的第一行转换为带有Key-Value键值对的Map。
  • MapListHandler:将结果集转换为带有Key-Value键值对的Map集合。

例如,以下代码将使用BeanListHandler将查询结果转换为Java对象集合:

try (Connection conn = getDBConnection()) {
    QueryRunner qr = new QueryRunner();
    List<Customer> customers = qr.query(conn, "SELECT * FROM customers", new BeanListHandler<>(Customer.class));
    for (Customer customer : customers) {
        System.out.println(customer);
    }
} catch (SQLException ex) {
    ex.printStackTrace();
}
BasicDataSource

BasicDataSource是DBUtils中提供的一个简单实用的数据源类,实现了数据库连接池机制和常见的数据库连接属性配置。使用BasicDataSource可以方便地获取数据库连接,具有以下优点:

  • 可以配置最大连接数、最小连接数、初始连接数、最大等待时间等参数,以充分利用数据库连接资源。
  • 支持连接验证查询,可以保证连接的有效性。
  • 支持自动重连,可以处理数据库连接异常,提高应用程序的稳定性。

以下是使用BasicDataSource获取数据库连接并执行SQL查询的示例代码:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/mydatabase");
ds.setUsername("myuser");
ds.setPassword("mypassword");
ds.setMaxTotal(100);
ds.setMinIdle(10);
ds.setMaxWaitMillis(10000);
ds.setValidationQuery("SELECT 1");

try (Connection conn = ds.getConnection()) {
    QueryRunner qr = new QueryRunner();
    List<Customer> customers = qr.query(conn, "SELECT * FROM customers", new BeanListHandler<>(Customer.class));
    for (Customer customer : customers) {
        System.out.println(customer);
    }
} catch (SQLException ex) {
    ex.printStackTrace();
}

总之,Apache Commons DBUtils提供了一组简单易用、可扩展的JDBC实用程序,方便开发人员编写数据库访问代码,并提高应用程序的性能和稳定性。