Apache Commons DbUtils 是輕量級 JDBC 封裝庫,核心類 QueryRunner 大幅減少樣板碼(關閉資源、迭代 ResultSet、映射物件)。本文示範搭配 JNDI DataSource 進行新增操作。
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version> <!-- 或更新版本 -->
</dependency>
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
public void insertUser(String username, String password) {
String sql = "INSERT INTO users(username, password) VALUES (?, ?)";
Object[] params = { username, password };
try {
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:/comp/env/jdbc/Oracle");
QueryRunner qr = new QueryRunner(ds); // 直接傳入 DataSource,內部自動管理連線
int rows = qr.update(sql, params); // 執行 INSERT/UPDATE/DELETE
System.out.println("影響列數:" + rows);
} catch (Exception e) {
e.printStackTrace();
}
}
| 場景 | 傳統 JDBC | DbUtils |
|---|---|---|
| 更新操作 | 手動 getConnection、prepare、execute、close | qr.update(sql, params) 一行搞定 |
| 查詢單筆映射 Bean | 手動迭代 ResultSet、setter 注入 | qr.query(sql, new BeanHandler<User>(User.class), params) |
| 查詢多筆映射 List | 同上 | qr.query(sql, new BeanListHandler<User>(User.class), params) |
| 查詢單值 | ... | qr.query(sql, new ScalarHandler<Long>(), params) |
DataSource 給 QueryRunner 時,每次操作會自動 getConnection() 並 close(),適合簡單業務;若需跨多條 SQL 共用同一連線(交易),請改用 QueryRunner(DataSource, true) 或手動控制 Connection。ojdbc8.jar)。