Apache Commons DBUtils - 快速指南



Apache Commons DBUtils - 概述

Apache Commons DbUtils 库是一组非常小的类,旨在简化 JDBC 调用处理,避免资源泄漏并编写更简洁的代码。由于 JDBC 资源清理非常繁琐且容易出错,因此 DBUtils 类有助于抽象出样板代码,使开发人员能够专注于数据库相关操作。

DBUtils 的优势

使用 Apache Commons DBUtils 的优势如下所示:

  • 无资源泄漏 - DBUtils 类确保不会发生任何资源泄漏。

  • 简洁明了的代码 - DBUtils 类提供简洁明了的代码来执行数据库操作,无需编写清理或资源泄漏预防代码。

  • Bean 映射 - DBUtils 类支持从结果集自动填充 JavaBean。

DBUtils 设计原则

Apache Commons DBUtils 的设计原则如下:

  • 小巧 - DBUtils 库体积非常小,包含的类很少,因此易于理解和使用。

  • 透明 - DBUtils 库在幕后不会执行太多工作。它只是获取查询并执行。

  • 快速 - DBUtils 库类不会创建许多后台对象,并且在数据库操作执行中速度很快。

Apache Commons DBUtils - 环境设置

要开始使用 DBUtils 进行开发,您应该按照以下步骤设置您的 DBUtils 环境。我们假设您正在 Windows 平台上工作。

安装 Java

Java 官方网站 安装 J2SE Development Kit 5.0 (JDK 5.0)。

确保如下所述设置以下环境变量:

  • JAVA_HOME - 此环境变量应指向您安装 JDK 的目录,例如 C:\Program Files\Java\jdk1.5.0。

  • CLASSPATH - 此环境变量应设置适当的路径,例如 C:\Program Files\Java\jdk1.5.0_20\jre\lib。

  • PATH - 此环境变量应指向适当的 JRE bin,例如 C:\Program Files\Java\jre1.5.0_20\bin。

您可能已设置了这些变量,但为了确保,以下是检查方法。

  • 转到控制面板,然后双击“系统”。如果您是 Windows XP 用户,则可能需要先打开“性能和维护”,然后才能看到“系统”图标。

  • 转到“高级”选项卡,然后单击“环境变量”。

  • 现在检查所有上述变量是否已正确设置。

安装数据库

当然,您将需要最重要的一个东西,即一个实际运行的数据库以及您可以查询和修改的表。

安装最适合您的数据库。您可以有很多选择,最常见的是:

  • MySQL DB:MySQL 是一个开源数据库。您可以从 MySQL 官方网站 下载它。我们建议下载完整 Windows 安装程序。

    此外,请下载并安装 MySQL Administrator 以及 MySQL Query Browser。这些是基于 GUI 的工具,可以使您的开发更加轻松。

    最后,下载并解压缩 MySQL Connector/J(MySQL JDBC 驱动程序)到一个方便的目录中。在本教程中,我们假设您已将驱动程序安装在 C:\Program Files\MySQL\mysql-connector-java-5.1.8 中。

    相应地,将 CLASSPATH 变量设置为 C:\Program Files\MySQL\mysql-connector-java-5.1.8\mysql-connector-java-5.1.8-bin.jar。您的驱动程序版本可能因安装而异。

  • PostgreSQL DB:PostgreSQL 是一个开源数据库。您可以从 PostgreSQL 官方网站 下载它。

    Postgres 安装包含一个名为 pgAdmin III 的基于 GUI 的管理工具。JDBC 驱动程序也作为安装的一部分包含在内。

  • Oracle DB - Oracle DB 是 Oracle 公司销售的商业数据库。我们假设您有必要的安装介质来安装它。

    Oracle 安装包含一个名为 Enterprise Manager 的基于 GUI 的管理工具。JDBC 驱动程序也作为安装的一部分包含在内。

安装数据库驱动程序

最新的 JDK 包含一个 JDBC-ODBC 桥接驱动程序,使大多数开放数据库连接 (ODBC) 驱动程序可供使用 JDBC API 的程序员使用。

现在,大多数数据库供应商都在随数据库安装一起提供相应的 JDBC 驱动程序。因此,您不必担心这部分。

设置数据库凭据

在本教程中,我们将使用 MySQL 数据库。当您安装任何上述数据库时,其管理员 ID 设置为 root,并提供设置您选择的密码的功能。

使用 root ID 和密码,您可以创建另一个用户 ID 和密码,或者您可以使用 root ID 和密码用于您的 JDBC 应用程序。

有各种数据库操作(如数据库创建和删除),需要管理员 ID 和密码。

在其余的 JDBC 教程中,我们将使用 MySQL 数据库,用户名 为 ID,密码 为密码。

如果您没有足够的权限创建新用户,则可以请求您的数据库管理员 (DBA) 为您创建一个用户 ID 和密码。

创建数据库

要创建 emp 数据库,请使用以下步骤:

步骤 1

打开一个 命令提示符 并更改到安装目录,如下所示:

C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>

注意:mysqld.exe 的路径可能因 MySQL 在系统上的安装位置而异。您还可以查看文档,了解如何启动和停止数据库服务器。

步骤 2

如果数据库服务器尚未运行,请执行以下命令启动它。

C:\Program Files\MySQL\bin>mysqld
C:\Program Files\MySQL\bin>

步骤 3

通过执行以下命令创建 emp 数据库:

C:\Program Files\MySQL\bin> mysqladmin create emp -u root -p
Enter password: ********
C:\Program Files\MySQL\bin>

创建表

要在 emp 数据库中创建 Employees 表,请使用以下步骤:

步骤 1

打开一个 命令提示符 并更改到安装目录,如下所示:

C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>

步骤 2

登录数据库,如下所示:

C:\Program Files\MySQL\bin>mysql -u root -p
Enter password: ********
mysql>

步骤 3

创建表 Employee,如下所示:

mysql> use emp;
mysql> create table Employees
    -> (
    -> id int not null,
    -> age int not null,
    -> first varchar (255),
    -> last varchar (255)
    -> );
Query OK, 0 rows affected (0.08 sec)
mysql>

创建数据记录

最后,您可以在 Employee 表中创建一些记录,如下所示:

mysql> INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
Query OK, 1 row affected (0.00 sec)

mysql>

要全面了解 MySQL 数据库,请学习 MySQL 教程

下载 Commons DBUtils 归档文件

commons-dbutils-1.7-bin.zip 下载 Apache Common DBUtils jar 文件的最新版本,MySql 连接器 mysql-connector-java-5.1.28-bin.jar,Apache Commons DBCP commons-dbcp2-2.1.1-bin.zip,Apache Commons Pool commons-pool2-2.4.3-bin.zip 和 Apache Commons Logging commons-logging-1.2-bin.zip。在撰写本教程时,我们已下载了 commons-dbutils-1.7-bin.zipmysql-connector-java-5.1.28-bin.jarcommons-dbcp2-2.1.1-bin.zipcommons-pool2-2.4.3-bin.zipcommons-logging-1.2-bin.zip 并将其复制到 C:\>Apache 文件夹中。

操作系统 归档文件名
Windows commons-dbutils-1.7-bin.zip
Linux commons-dbutils-1.7-bin.tar.gz
Mac commons-dbutils-1.7-bin.tar.gz

设置 Apache Common DBUtils 环境

设置 APACHE_HOME 环境变量以指向 Apache jar 存储在您机器上的基本目录位置。假设我们在各个操作系统上的 Apache 文件夹中解压缩了 commons-dbutils-1.7-bin.zip,如下所示。

操作系统 输出
Windows 将环境变量 APACHE_HOME 设置为 C:\Apache
Linux export APACHE_HOME=/usr/local/Apache
Mac export APACHE_HOME=/Library/Apache

设置 CLASSPATH 变量

设置 CLASSPATH 环境变量以指向 Common IO jar 的位置。假设您已将 commons-dbutils-1.7-bin.zip 存储在各个操作系统上的 Apache 文件夹中,如下所示。

操作系统 输出
Windows 将环境变量 CLASSPATH 设置为 %CLASSPATH%;%APACHE_HOME%\commons-dbutils-1.7.jar;mysql-connector-java-5.1.28.jar;commons-dbcp2-2.1.1.jar;commons-pool2-2.4.3.jar;commons-logging-1.2.jar;
Linux export CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-dbutils-1.7.jar:mysql-connector-java-5.1.28.jar:commons-dbcp2-2.1.1:commons-pool2-2.4.3.jar:commons-logging-1.2.jar.
Mac export CLASSPATH=$CLASSPATH:$APACHE_HOME/commons-dbutils-1.7.jar:mysql-connector-java-5.1.28:commons-dbcp2-2.1.1.jar:commons-pool2-2.4.3.jar;commons-logging-1.2.jar.

现在您可以开始尝试使用 DBUtils 了。下一章将为您提供有关 DBUtils 编程的示例。

Apache Commons DBUtils - 第一个应用程序

本章提供了一个使用 DBUtils 库创建简单 JDBC 应用程序的示例。这将向您展示如何打开数据库连接、执行 SQL 查询以及显示结果。

本模板示例中提到的所有步骤都将在本教程的后续章节中进行解释。

创建 JDBC 应用程序

构建 JDBC 应用程序涉及以下六个步骤:

  • 导入包 - 需要包含包含数据库编程所需的 JDBC 类的包。大多数情况下,使用 import java.sql.* 就足够了。

  • 注册 JDBC 驱动程序 - 需要初始化驱动程序,以便您可以打开与数据库的通信通道。

  • 打开连接 - 需要使用 DriverManager.getConnection() 方法创建 Connection 对象,该对象表示与数据库的物理连接。

  • 执行查询 - 需要使用 Statement 类型的对象来构建和提交 SQL 语句到数据库。

  • 从结果集提取数据 - 需要使用适当的 ResultSet.getXXX() 方法从结果集中检索数据。

  • 清理环境 - 需要显式关闭所有数据库资源,而不是依赖 JVM 的垃圾回收。

示例代码

此示例可以作为模板,当您将来需要创建自己的 JDBC 应用程序时。

此示例代码是基于上一章中完成的环境和数据库设置编写的。

将以下示例复制并粘贴到 MainApp.java 中,编译并运行如下 -

MainApp.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://:3306/emp";
   
   // Database credentials
   static final String USER = "root";
   static final String PASS = "admin";
   
   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      
      //Step 3: Create a ResultSet Handler to handle Employee Beans
      ResultSetHandler<Employee> resultHandler = new BeanHandler<Employee>(Employee.class);
      
      try {
         Employee emp = queryRunner.query(conn,
            "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", First: " + emp.getFirst());
         System.out.println(", Last: " + emp.getLast());
      } finally {
         DbUtils.close(conn);
      }
   }
}

Employee.java

程序如下所示 -

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

现在让我们编译上述示例,如下所示 -

C:\>javac MainApp.java Employee.java
C:\>

运行MainApp时,会产生以下结果 -

C:\>java MainApp
Connecting to database...
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

Apache Commons DBUtils - 创建查询

以下示例将演示如何使用 DBUtils 和 Insert 查询创建记录。我们将向 Employees 表中插入一条记录。

语法

创建查询的语法如下所示 -

String insertQuery ="INSERT INTO employees(id,age,first,last) VALUES (?,?,?,?)";
int insertedRecords = queryRunner.update(conn, insertQuery,104,30, "Sohan","Kumar");

其中,

  • insertQuery - 包含占位符的 Insert 查询。

  • queryRunner - 用于将员工对象插入数据库的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行插入查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://:3306/emp";
   
   // Database credentials
   static final String USER = "root";
   static final String PASS = "admin";
   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      DbUtils.loadDriver(JDBC_DRIVER);
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      try {
         int insertedRecords = queryRunner.update(conn,
            "INSERT INTO employees(id,age,first,last) VALUES (?,?,?,?)",
            104,30, "Sohan","Kumar");
         System.out.println(insertedRecords + " record(s) inserted");
      } finally {
         DbUtils.close(conn);
      }
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息 -

1 record(s) inserted.

Apache Commons DBUtils - 读取查询

以下示例将演示如何使用 DBUtils 和 Read 查询读取记录。我们将从 Employees 表中读取一条记录。

语法

读取查询的语法如下所示 -

ResultSetHandler<Employee> resultHandler = new BeanHandler<Employee>(Employee.class);
Employee emp = queryRunner.query(conn, "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");

其中,

  • resultHandler - 用于将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   // Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      
      //Step 3: Create a ResultSet Handler to handle Employee Beans
      ResultSetHandler<Employee> resultHandler =
         new BeanHandler<Employee>(Employee.class);
      try {
         Employee emp = queryRunner.query(conn,
            "SELECT * FROM employees WHERE id=?", resultHandler, 104);
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", First: " + emp.getFirst());
         System.out.println(", Last: " + emp.getLast());
      } finally {
         DbUtils.close(conn);
      }
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息

ID: 104, Age: 30, First: Sohan, Last: Kumar

Apache Commons DBUtils - 更新查询

以下示例将演示如何使用 DBUtils 和 Update 查询更新记录。我们将更新 Employees 表中的一条记录。

语法

更新查询的语法如下所示 -

String updateQuery = "UPDATE employees SET age=? WHERE id=?";
int updatedRecords = queryRunner.update(conn, updateQuery, 33,104);

其中,

  • updateQuery - 包含占位符的 Update 查询。

  • queryRunner - 用于更新数据库中 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行更新查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   // Database credentials
   static final String USER = "root";
   static final String PASS = "admin";
   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      DbUtils.loadDriver(JDBC_DRIVER);
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      try {
         int updatedRecords = queryRunner.update(conn,
            "UPDATE employees SET age=? WHERE id=?", 33,104);
         System.out.println(updatedRecords + " record(s) updated.");
      } finally {
         DbUtils.close(conn);
      }
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息 -

1 record(s) updated.

Apache Commons DBUtils - 删除查询

以下示例将演示如何使用 DBUtils 和 Delete 查询删除记录。我们将删除 Employees 表中的一条记录。

语法

删除查询的语法如下所示 -

String deleteQuery = "DELETE FROM employees WHERE id=?";
int deletedRecords = queryRunner.delete(conn, deleteQuery, 33,104);

其中,

  • deleteQuery - 包含占位符的 DELETE 查询。

  • queryRunner - 用于删除数据库中 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行删除查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   // Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      DbUtils.loadDriver(JDBC_DRIVER);
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      try {
         int deletedRecords = queryRunner.update(conn,
            "DELETE from employees WHERE id=?", 104);
         System.out.println(deletedRecords + " record(s) deleted.");
      } finally {
         DbUtils.close(conn);
      }
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息 -

1 record(s) deleted.

QueryRunner 接口

org.apache.commons.dbutils.QueryRunner 类是 DBUtils 库的核心类。它使用可插入的策略来处理 ResultSets 执行 SQL 查询。此类是线程安全的。

类声明

以下是 org.apache.commons.dbutils.QueryRunner 类的声明 -

public class QueryRunner
   extends AbstractQueryRunner

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 使用 QueryRunner 对象方法进行数据库操作。

示例

以下示例将演示如何使用 QueryRunner 类读取记录。我们将读取 employee 表中的一条可用记录。

语法

ResultSetHandler<Employee> resultHandler = new BeanHandler<Employee>(Employee.class);
Employee emp = 
   queryRunner.query(conn, "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");

其中,

  • resultHandler - 用于将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      //Step 3: Create a ResultSet Handler to handle Employee Beans
      ResultSetHandler<Employee> resultHandler = new BeanHandler<Employee>(Employee.class);

      try {
         Employee emp = queryRunner.query(conn,
            "SELECT * FROM employees WHERE id=?", resultHandler, 103);
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", First: " + emp.getFirst());
         System.out.println(", Last: " + emp.getLast());
      } finally {
         DbUtils.close(conn);
      }        
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 103, Age: 28, First: Sumit, Last: Mittal

AsyncQueryRunner 接口

org.apache.commons.dbutils.AsyncQueryRunner 类有助于使用异步支持执行长时间运行的 SQL 查询。此类是线程安全的。此类支持与 QueryRunner 相同的方法,但它返回 Callable 对象,这些对象稍后可用于检索结果。

类声明

以下是 org.apache.commons.dbutils.AsyncQueryRunner 类的声明 -

public class AsyncQueryRunner
   extends AbstractQueryRunner

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 使用 AsyncQueryRunner 对象方法进行数据库操作。

示例

以下示例将演示如何使用 AsyncQueryRunner 类更新记录。我们将更新 employee 表中的一条可用记录。

语法

String updateQuery = "UPDATE employees SET age=? WHERE id=?";
future = asyncQueryRunner.update(conn,
            "UPDATE employees SET age=? WHERE id=?", 33,103);

其中,

  • updateQuery - 包含占位符的 Update 查询。

  • asyncQueryRunner - 用于更新数据库中 Employee 对象的 asyncQueryRunner 对象。

  • future - 用于稍后检索结果的 Future 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将以异步模式运行更新查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.AsyncQueryRunner;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.ExecutorCompletionService; 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; 
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws 
      SQLException, InterruptedException, 
      ExecutionException, TimeoutException {
      Connection conn = null;

      AsyncQueryRunner asyncQueryRunner = new AsyncQueryRunner( Executors.newCachedThreadPool());

      DbUtils.loadDriver(JDBC_DRIVER);       
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      Future<Integer> future = null;
      try {
         future = asyncQueryRunner.update(conn, 
            "UPDATE employees SET age=? WHERE id=?", 33,103);         
         Integer updatedRecords = future.get(10, TimeUnit.SECONDS);
         System.out.println(updatedRecords + " record(s) updated.");
      } finally {
         DbUtils.close(conn);
      }  
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

1 record(s) updated.

ResultSetHandler 接口

org.apache.commons.dbutils.ResultSetHandler 接口负责将 ResultSets 转换为对象。

类声明

以下是 org.apache.commons.dbutils.ResultSetHandler 类的声明 -

public interface ResultSetHandler<T>

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 创建 ResultSetHandler 的实现。

  • 步骤 3 - 将 resultSetHandler 传递给 QueryRunner 对象,并进行数据库操作。

示例

以下示例将演示如何使用 ResultSetHandler 类映射记录。我们将读取 Employee 表中的一条可用记录。

语法

Employee emp = queryRunner.query(conn, "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");

其中,

  • resultHandler - 用于将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Arrays;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      //Step 3: Create a ResultSet Handler to handle Employee Beans
      ResultSetHandler<Object[]> handler = new ResultSetHandler<Object[]>() {
         public Object[] handle(ResultSet rs) throws SQLException {
            if (!rs.next()) {
               return null;
            }
            ResultSetMetaData meta = rs.getMetaData();
            int cols = meta.getColumnCount();
            Object[] result = new Object[cols];

            for (int i = 0; i < cols; i++) {
               result[i] = rs.getObject(i + 1);
            }
            return result;
         }
      };

      try {
         Object[] result  = queryRunner.query(conn, "SELECT * FROM employees WHERE id=?",
            handler, 103);
         //Display values
         System.out.print("Result: " + Arrays.toString(result));            
      } finally {
         DbUtils.close(conn);
      }              
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

Connecting to database...
Result: [103, 33, Sumit, Mittal]

Apache Commons DBUtils - BeanHandler 类

org.apache.commons.dbutils.BeanHandler 是 ResultSetHandler 接口的实现,负责将第一个 ResultSet 行转换为 JavaBean。此类是线程安全的。

类声明

以下是 org.apache.commons.dbutils.BeanHandler 类的声明 -

public class BeanHandler<T>
   extends Object implements ResultSetHandler<T>

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 获取 BeanHandler 对象作为 ResultSetHandler 的实现。

  • 步骤 3 - 将 resultSetHandler 传递给 QueryRunner 对象,并进行数据库操作。

示例

以下示例将演示如何使用 BeanHandler 类读取记录。我们将读取 Employees 表中的一条可用记录并将其映射到 Employee bean。

语法

Employee emp = queryRunner.query(conn, "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");

其中,

  • resultHandler - 用于将结果集映射到 Employee 对象的 BeanHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      //Step 3: Create a ResultSet Handler to handle Employee Beans
      ResultSetHandler<Employee> resultHandler 
         = new BeanHandler<Employee>(Employee.class);

      try {
         Employee emp = queryRunner.query(conn,
            "SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", First: " + emp.getFirst());
         System.out.println(", Last: " + emp.getLast());
      } finally {
         DbUtils.close(conn);
      }              
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 103, Age: 28, First: Sumit, Last: Mittal

BeanListHandler 类

org.apache.commons.dbutils.BeanListHandler 是 ResultSetHandler 接口的实现,负责将 ResultSet 行转换为 Java Bean 列表。此类是线程安全的。

类声明

以下是 org.apache.commons.dbutils.BeanListHandler 类的声明 -

public class BeanListHandler<T>
   extends Object implements ResultSetHandler<List<T>>

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 获取 BeanListHandler 对象作为 ResultSetHandler 的实现。

  • 步骤 3 - 将 resultSetHandler 传递给 QueryRunner 对象,并进行数据库操作。

示例

以下示例将演示如何使用 BeanListHandler 类读取记录列表。我们将读取 Employees 表中的可用记录并将它们映射到 Employee bean 列表。

语法

List<Employee> empList = queryRunner.query(conn, "SELECT * FROM employees", resultHandler);      

其中,

  • resultHandler - 用于将结果集映射到 Employee 对象列表的 BeanListHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

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

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      //Step 3: Create a ResultSet Handler to handle List of Employee Beans
      ResultSetHandler<List<Employee>> resultHandler = new BeanListHandler<Employee>(Employee.class);

      try {
         List<Employee> empList = queryRunner.query(conn, "SELECT * FROM employees", resultHandler);
         for(Employee emp: empList ) {
            //Display values
            System.out.print("ID: " + emp.getId());
            System.out.print(", Age: " + emp.getAge());
            System.out.print(", First: " + emp.getFirst());
            System.out.println(", Last: " + emp.getLast());
         }           
      } finally {
         DbUtils.close(conn);
      }        
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal

ArrayListHandler 类

org.apache.commons.dbutils.ArrayListHandler 是 ResultSetHandler 接口的实现,负责将 ResultSet 行转换为 object[]。此类是线程安全的。

类声明

以下是 org.apache.commons.dbutils.ArrayListHandler 类的声明 -

public class ArrayListHandler
   extends AbstractListHandler<Object[]>

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 获取 ArrayListHandler 对象作为 ResultSetHandler 的实现。

  • 步骤 3 - 将 resultSetHandler 传递给 QueryRunner 对象,并进行数据库操作。

示例

以下示例将演示如何使用 ArrayListHandler 类读取记录列表。我们将读取 Employees 表中的可用记录作为 object[]。

语法

List<Object> result = queryRunner.query(conn, "SELECT * FROM employees", new ArrayListHandler());       

其中,

  • resultHandler - 用于将结果集映射到 object[] 列表的 ArrayListHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

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

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);        

      try {
         List<Object[]> result = queryRunner.query(conn, "SELECT * FROM employees"
            , new ArrayListHandler());  
         for(Object[] objects : result) {
            System.out.println(Arrays.toString(objects));
         }           
      } finally {
         DbUtils.close(conn);
      }        
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

[100, 18, Zara, Ali]
[101, 25, Mahnaz, Fatma]
[102, 30, Zaid, Khan]
[103, 28, Sumit, Mittal]

MapListHandler 类

org.apache.commons.dbutils.MapListHandler 是 ResultSetHandler 接口的实现,负责将 ResultSet 行转换为 Maps 列表。此类是线程安全的。

类声明

以下是 org.apache.commons.dbutils.MapListHandler 类的声明 -

public class MapListHandler
   extends AbstractListHandler<Map<String,Object>>

用法

  • 步骤 1 - 创建连接对象。

  • 步骤 2 - 获取 MapListHandler 对象作为 ResultSetHandler 的实现。

  • 步骤 3 - 将 resultSetHandler 传递给 QueryRunner 对象,并进行数据库操作。

示例

以下示例将演示如何使用 MapListHandler 类读取记录列表。我们将读取 Employees 表中的可用记录作为 maps 列表。

语法

List<Map<String, Object>> result = queryRunner.query(conn, "SELECT * FROM employees", new MapListHandler());

其中,

  • resultHandler - 用于将结果集映射到 maps 列表的 MapListHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      
      //Step 1: Register JDBC driver
      DbUtils.loadDriver(JDBC_DRIVER);

      //Step 2: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);        

      try {
         List<Map<String, Object>> result = queryRunner.query(
            conn, "SELECT * FROM employees", new MapListHandler());      
         System.out.println(result);
      } finally {
         DbUtils.close(conn);
      }        
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

Connecting to database...
[{id=100, age=18, first=Zara, last=Ali}, 
{id=101, age=25, first=Mahnaz, last=Fatma}, 
{id=102, age=30, first=Zaid, last=Khan}, 
{id=103, age=33, first=Sumit, last=Mittal}]

Apache Commons DBUtils - 自定义处理器

我们可以通过实现 ResultSetHandler 接口或扩展 ResultSetHandler 的任何现有实现来创建自己的自定义处理器。在下面给出的示例中,我们创建了一个自定义处理器 EmployeeHandler,它扩展了 BeanHandler 类。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   private String name;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

以下是 EmployeeHandler.java 文件的内容。

import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbutils.handlers.BeanHandler;

public class EmployeeHandler extends BeanHandler<Employee> {

   public EmployeeHandler() {
      super(Employee.class);
   }

   @Override
   public Employee handle(ResultSet rs) throws SQLException {
      Employee employee = super.handle(rs);
      employee.setName(employee.getFirst() +", " + employee.getLast());
      return employee;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();
      DbUtils.loadDriver(JDBC_DRIVER);                 
      conn = DriverManager.getConnection(DB_URL, USER, PASS);        
      EmployeeHandler employeeHandler = new EmployeeHandler();

      try {
         Employee emp = queryRunner.query(conn,
         "SELECT * FROM employees WHERE first=?", employeeHandler, "Sumit");
         
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", Name: " + emp.getName());
      } finally {
         DbUtils.close(conn);
      }        
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 103, Age: 28, Name: Sumit, Mittal

自定义行处理器

如果数据库表中的列名和等效的 javabean 对象名不相同,则可以使用自定义的 BasicRowProcessor 对象来映射它们。请参阅下面的示例。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   private String name;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

以下是 EmployeeHandler.java 文件的内容。

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.BeanProcessor;
import org.apache.commons.dbutils.BasicRowProcessor;

public class EmployeeHandler extends BeanHandler<Employee> {

   public EmployeeHandler() {
      super(Employee.class, new BasicRowProcessor(new BeanProcessor(mapColumnsToFields())));
   }

   @Override
   public Employee handle(ResultSet rs) throws SQLException {
      Employee employee = super.handle(rs);
      employee.setName(employee.getFirst() +", " + employee.getLast());
      return employee;
   }
   
   public static Map<String, String> mapColumnsToFields() {
      Map<String, String> columnsToFieldsMap = new HashMap<>();
      columnsToFieldsMap.put("ID", "id");
      columnsToFieldsMap.put("AGE", "age");        
      return columnsToFieldsMap;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

public class MainApp {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";

   public static void main(String[] args) throws SQLException {
      Connection conn = null;
      QueryRunner queryRunner = new QueryRunner();      
      DbUtils.loadDriver(JDBC_DRIVER);                 
      conn = DriverManager.getConnection(DB_URL, USER, PASS);        
      EmployeeHandler employeeHandler = new EmployeeHandler();

      try {
         Employee emp = queryRunner.query(conn,
           "SELECT * FROM employees WHERE first=?", employeeHandler, "Sumit");
         
         //Display values
         System.out.print("ID: " + emp.getId());
         System.out.print(", Age: " + emp.getAge());
         System.out.print(", Name: " + emp.getName());
      } finally {
         DbUtils.close(conn);
      }              
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 103, Age: 28, Name: Sumit, Mittal

Apache Commons DBUtils - 使用数据源

到目前为止,我们在使用 QueryRunner 时一直使用连接对象。我们也可以无缝地使用数据源。以下示例将演示如何使用 QueryRunner 和数据源读取记录。我们将从 Employees 表中读取一条记录。

语法

QueryRunner queryRunner = new QueryRunner( dataSource );
Employee emp = queryRunner.query("SELECT * FROM employees WHERE first=?", resultHandler, "Sumit");

其中,

  • dataSource - 已配置的数据源对象。

  • resultHandler - 用于将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  • queryRunner - 用于从数据库读取 Employee 对象的 QueryRunner 对象。

为了理解上面提到的与 DBUtils 相关的概念,让我们编写一个将运行读取查询的示例。为了编写我们的示例,让我们创建一个示例应用程序。

步骤 描述
1 更新在章节 DBUtils - 第一个应用程序 中创建的 MainApp.java 文件。
2 编译并运行应用程序,如下所述。

以下是 Employee.java 的内容。

public class Employee {
   private int id;
   private int age;
   private String first;
   private String last;
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getFirst() {
      return first;
   }
   public void setFirst(String first) {
      this.first = first;
   }
   public String getLast() {
      return last;
   }
   public void setLast(String last) {
      this.last = last;
   }
}

以下是 CustomDatasource.java 的内容。

import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;

public class CustomDataSource {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://:3306/emp";
   
   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";
   private static DataSource datasource;
   private static final BasicDataSource basicDataSource;

   static {
      basicDataSource = new BasicDataSource();
      basicDataSource.setDriverClassName(JDBC_DRIVER);
      basicDataSource.setUsername(USER);
      basicDataSource.setPassword(PASS);
      basicDataSource.setUrl(DB_URL);
   }

   public static DataSource getInstance() {
      return basicDataSource;
   }
}

以下是 MainApp.java 文件的内容。

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class MainApp {
   public static void main(String[] args) throws SQLException {    
      
      DbUtils.loadDriver(JDBC_DRIVER);
      QueryRunner run = new QueryRunner(CustomDataSource.getInstance());
      ResultSetHandler<Employee> resultHandler = new BeanHandler<Employee>(Employee.class);

      Employee emp = queryRunner.query("SELECT * FROM employees WHERE id=?",
         resultHandler, 103);
      
      //Display values
      System.out.print("ID: " + emp.getId());
      System.out.print(", Age: " + emp.getAge());
      System.out.print(", First: " + emp.getFirst());
      System.out.println(", Last: " + emp.getLast());
   }
}

创建完源文件后,让我们运行应用程序。如果您的应用程序一切正常,它将打印以下消息。

ID: 103, Age: 33, First: Sumit, Last: Mittal
广告

© . All rights reserved.