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
廣告