Dbutils 简明教程

Apache Commons DBUtils - Quick Guide

Apache Commons DBUtils - Overview

Apache Commons DbUtils 库是一组相当小的类,旨在更容易地处理 JDBC 调用而不泄漏资源,且具有更清晰的代码。由于 JDBC 资源清理相当繁琐且容易出错,因此 DBUtils 类有助于抽象出样板代码,以便开发人员仅能专注于与数据库相关的操作。

Advantages of DBUtils

使用 Apache Commons DBUtils 的优点如下:

  1. No Resource Leakage − DBUtils 类确保没有任何资源泄漏。

  2. Clean & Clear code − DBUtils 类提供干净且清晰的代码来执行数据库操作,而无需编写清理或资源泄漏预防代码。

  3. Bean Mapping − DBUtils 类支持从结果集中自动填充 javabean。

DBUtils Design Principles

Apache Commons DBUtils 的设计原则如下:

  1. Small − DBUtils 库体积很小,类更少,因此易于理解和使用。

  2. Transparent − DBUtils 库不会在后台执行太多工作。它只是执行查询。

  3. Fast − DBUtils 库类不会创建许多后台对象,且在数据库操作执行中相当快。

Apache Commons DBUtils - Environment Setup

要开始使用 DBUtils 进行开发,您应按照以下所示步骤设置 DBUtils 环境。我们假设您使用的是 Windows 平台。

Install Java

Java Official Site 安装 J2SE 开发工具包 5.0 (JDK 5.0)。

确保以下环境变量按照如下所述进行设置 −

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

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

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

您的计算机可能已设置这些变量,但为了确保万无一失,这里列出了检查方法。

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

  2. 转到高级选项卡,然后单击环境变量。

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

Install Database

当然,您将需要最重要的实际运行数据库,其中包含您可以查询和修改的表。

安装最适合于你的数据库。你有很多选择,最常见的是 −

  1. MySQL DB: MySQL 是一个开源数据库。您可以从 MySQL Official Site 下载它。我们建议下载完整的 Windows 安装程序。此外,还要下载并安装 MySQL AdministratorMySQL 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。您的驱动程序版本可能因您的安装而异。

  2. PostgreSQL DB: PostgreSQL 是一个开源数据库。您可以从 PostgreSQL Official Site 下载它。PostgreSQL 安装程序包含一个名为 pgAdmin III 的基于 GUI 的管理工具。JDBC 驱动程序也包含在安装程序中。

  3. Oracle DB − Oracle DB 是由 Oracle 公司销售的一款商用数据库。我们假设您有必要的发行介质进行安装。Oracle 安装程序包含一个名为 Enterprise Manager 的基于 GUI 的管理工具。JDBC 驱动程序也包含在安装程序中。

Install Database Drivers

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

现在,大多数数据库供应商在数据库安装中都提供了适当的 JDBC 驱动程序。因此,您无需担心这一部分。

Set Database Credential

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

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

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

在 JDBC 教程的其余部分中,我们将使用 ID 为 username 、密码为 password 的 MySQL 数据库。

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

Create Database

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

Step 1

打开 Command Prompt 并更改到安装目录,如下所示 −

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

Note: mysqld.exe 的路径可能会根据 MySQL 在你的系统上的安装位置而有所不同。你还可以查看有关如何启动和停止你的数据库服务器的文件说明。

Step 2

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

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

Step 3

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

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

Create Table

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

Step 1

打开 Command Prompt 并更改到安装目录,如下所示 −

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

Step 2

登录数据库,如下所示 −

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

Step 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>

Create Data Records

最后,在 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 Tutorial

Download Commons DBUtils Archive

commons-dbutils-1.7-bin.zip 、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 下载 Apache Common DBUtils jar 文件的最新版本。在编写本教程时,我们已下载 commons-dbutils-1.7-bin.zip、mysql-connector-java-5.1.28-bin.jar、commons-dbcp2-2.1.1-bin.zip、commons-pool2-2.4.3-bin.zip、commons-logging-1.2-bin.zip 并将其复制到 C:\>Apache 文件夹中。

OS

Archive name

Windows

commons-dbutils-1.7-bin.zip

Linux

commons-dbutils-1.7-bin.tar.gz

Mac

commons-dbutils-1.7-bin.tar.gz

Set Apache Common DBUtils Environment

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

OS

Output

Windows

将环境变量 APACHE_HOME 设置为 C:\Apache

Linux

export APACHE_HOME=/usr/local/Apache

Mac

export APACHE_HOME=/Library/Apache

Set CLASSPATH Variable

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

OS

Output

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 - First Application

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

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

Creating JDBC Application

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

  1. Import the packages − 需要包含包含 JDBC 类的程序包,这是数据库编程所必需的。大多数情况下,使用 import java.sql. * 就足够了。

  2. Register the JDBC driver − 需要初始化驱动程序,以便您可以与数据库打开一个通信通道。

  3. Open a connection − 需要使用 DriverManager.getConnection() 方法创建一个 Connection 对象,它表示与数据库的物理连接。

  4. Execute a query - 需使用 Statement 类型对象来创建和向数据库提交 SQL 语句。

  5. Extract data from result set − 需要使用适当的 ResultSet.getXXX() 方法从结果集中检索数据。

  6. Clean up the environment − 需要显式关闭所有数据库资源,而不是依赖 JVM 的垃圾回收。

Sample Code

当您需要在未来创建自己的 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://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);
      }
   }
}

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 - Create Query

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

Syntax

创建查询的语法如下 −

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

其中,

  1. insertQuery − 具有占位符的插入查询。

  2. queryRunner − 插入数据库中员工对象的 QueryRunner 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 - Read Query

以下示例将演示如何使用 DBUtils 借助 Read 查询来读取记录。我们将读取 Employees 表中的记录。

Syntax

读取查询的语法如下 −

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

其中,

  1. resultHandler − 将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  2. queryRunner − 从数据库中读取员工对象的 QueryRunner 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 - Update Query

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

Syntax

更新查询的语法如下 −

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

其中,

  1. updateQuery − 具有占位符的更新查询。

  2. queryRunner − 用于更新数据库中员工对象的 QueryRunner 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 - Delete Query

下面的示例将演示如何借助 DBUtils 使用删除查询删除记录。我们将删除 Employees 表中的记录。

Syntax

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

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

其中,

  1. deleteQuery − 具有占位符的 DELETE 查询。

  2. queryRunner − 用于删除数据库中的员工对象的 QueryRunner 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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.

QueryRunner interface

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

Class Declaration

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

public class QueryRunner
   extends AbstractQueryRunner

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 − 使用 QueryRunner 对象方法进行数据库操作。

Example

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

Syntax

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

其中,

  1. resultHandler − 将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 interface

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

Class Declaration

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

public class AsyncQueryRunner
   extends AbstractQueryRunner

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 − 使用 AsyncQueryRunner 对象方法进行数据库操作。

Example

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

Syntax

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

其中,

  1. updateQuery − 具有占位符的更新查询。

  2. asyncQueryRunner − 用于更新数据库中员工对象的 asyncQueryRunner 对象。

  3. future − Future 对象用于稍后检索结果。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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.

ResultSetHandler interface

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

Class Declaration

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

public interface ResultSetHandler<T>

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 − 创建 ResultSetHandler 的实现。

  3. Step 3 - 将 resultSetHandler 传递到 QueryRunner 对象,并执行数据库操作。

Example

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

Syntax

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

其中,

  1. resultHandler − 将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 Class

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

Class Declaration

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

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

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 − 获得 ResultSetHandler 的实现,作为 BeanHandler 对象。

  3. Step 3 - 将 resultSetHandler 传递到 QueryRunner 对象,并执行数据库操作。

Example

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

Syntax

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

其中,

  1. resultHandler − BeanHandler 对象,用于将结果集映射到 Employee 对象。

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 Class

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

Class Declaration

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

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

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 - 将 ResultSetHandler 的实现作为 BeanListHandler 对象获取。

  3. Step 3 - 将 resultSetHandler 传递到 QueryRunner 对象,并执行数据库操作。

Example

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

Syntax

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

其中,

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

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 Class

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

Class Declaration

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

public class ArrayListHandler
   extends AbstractListHandler<Object[]>

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 - 将 ResultSetHandler 的实现作为 ArrayListHandler 对象获取。

  3. Step 3 - 将 resultSetHandler 传递到 QueryRunner 对象,并执行数据库操作。

Example

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

Syntax

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

其中,

  1. resultHandler − ArrayListHandler 对象,可将结果集映射到 object[] 的列表中。

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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 Class

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

Class Declaration

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

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

Usage

  1. Step 1 - 创建连接对象。

  2. Step 2 −获取MapListHandler对象形式的ResultSetHandler实现。

  3. Step 3 - 将 resultSetHandler 传递到 QueryRunner 对象,并执行数据库操作。

Example

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

Syntax

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

其中,

  1. resultHandler −将结果集映射到Map列表的MapListHandler对象。

  2. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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();

      //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 - Custom Handler

我们可以通过实现ResultSetHandler接口或通过扩展ResultSetHandler的任何已存在的实现,创建我们自己的自定义处理程序。在下面给出的示例中,我们通过扩展BeanHandler类创建了Custom Handler、EmployeeHandler。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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://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);
      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

Custom Row Processor

如果数据库表中的列名和等效 javabean 对象的名称不相似,我们便可以使用自定义 BasicRowProcessor 对象对它们进行映射。请参见以下示例。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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://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);
      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 - Using DataSource

到目前为止,我们在使用QueryRunner时使用连接对象。我们还可以无缝使用数据源。以下示例演示了如何在QueryRunner和数据源的帮助下使用Read查询读取记录。我们将从Employees表读取记录。

Syntax

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

其中,

  1. dataSource −已配置的数据源对象。

  2. resultHandler − 将结果集映射到 Employee 对象的 ResultSetHandler 对象。

  3. queryRunner - QueryRunner 对象,用于从数据库中读取 employee 对象。

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

Step

Description

1

更新在章节 DBUtils - First Application 下创建的文件 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://localhost: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