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 开发工具包 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 安装包括一个基于 GUI 的管理工具,称为 Enterprise Manager。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 数据库中创建员工表,请使用以下步骤 -

步骤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、MySql 连接器mysql-connector-java-5.1.28-bin.jar、Apache Commons DBCP commons-dbcp2-2.1.1-bin下载最新版本的 Apache Common DBUtils jar 文件。 zip、Apache Commons 池commons-pool2-2.4.3-bin.zip和 Apache Commons 日志记录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
苹果 commons-dbutils-1.7-bin.tar.gz

设置 Apache 通用 DBUtils 环境

将APACHE_HOME环境变量设置为指向计算机上存储 Apache jar 的基本目录位置。假设我们已经在各种操作系统上的 Apache 文件夹中提取了 commons-dbutils-1.7-bin.zip,如下所示。

操作系统 输出
Windows 将环境变量 APACHE_HOME 设置为 C:\Apache
Linux 导出 APACHE_HOME=/usr/local/Apache
苹果 导出 APACHE_HOME=/库/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 导出 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。
苹果 导出 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 中,编译并运行如下 -

主应用程序.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://localhost: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);
      }
   }
}

员工.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 的帮助下使用插入查询创建记录。我们将在员工表中插入一条记录。

句法

创建查询的语法如下 -

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

在哪里,

  • insertQuery - 插入具有占位符的查询。

  • 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://localhost: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 的帮助下使用读取查询读取记录。我们将从员工表中读取一条记录。

句法

读取查询的语法如下 -

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

在哪里,

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

  • 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;
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://localhost: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 的帮助下使用更新查询来更新记录。我们将更新员工表中的一条记录。

句法

更新查询的语法如下 -

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

在哪里,

  • updateQuery - 更新具有占位符的查询。

  • 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://localhost: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 的帮助下使用删除查询删除记录。我们将删除员工表中的一条记录。

句法

删除查询的语法如下 -

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

在哪里,

  • deleteQuery - 删除具有占位符的查询。

  • 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://localhost: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.

查询运行器接口

org.apache.commons.dbutils.QueryRunner类是 DBUtils 库中中心类。它使用可插入策略执行 SQL 查询来处理结果集。这个类是线程安全的。

类别声明

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

public class QueryRunner
   extends AbstractQueryRunner

用法

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

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

例子

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

句法

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

在哪里,

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

  • 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;
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://localhost: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 类更新记录。我们将更新员工表中的可用记录之一。

句法

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

在哪里,

  • updateQuery - 更新具有占位符的查询。

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

  • 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://localhost: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.

结果集处理程序接口

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

类别声明

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

public interface ResultSetHandler<T>

用法

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

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

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

例子

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

句法

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

在哪里,

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

  • 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 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://localhost: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 - 获取 ResultSetHandler 的实现作为 BeanHandler 对象。

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

例子

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

句法

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

在哪里,

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

  • 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;
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://localhost: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 - 获取 ResultSetHandler 的实现作为 BeanListHandler 对象。

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

例子

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

句法

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

在哪里,

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

  • 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 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://localhost: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 - 获取 ResultSetHandler 作为 ArrayListHandler 对象的实现。

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

例子

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

句法

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

在哪里,

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

  • 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 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://localhost: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 行转换为 Map 列表这个类是线程安全的。

类别声明

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

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

用法

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

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

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

例子

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

句法

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

在哪里,

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

  • 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 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://localhost: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();
      
      //Ste