commons-dbutils是Apache開源組織提供的用於操作數據庫的工具包。今天為大家介紹一下該包的常用方法。
對於數據庫的操作無外乎增刪改查,而增刪改本質上可以歸為一類,操作方式相同,只是SQL語法不同而已,所以我將以修改和查詢兩類來介紹commons-dbutils的用法。
首先我們來創建一個測試類,使用JUnit進行測試。
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.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DBUtilsTest
{
private Connection conn = null;
@Before
public void initConnection() throws SQLException, ClassNotFoundException
{
printCurrentMethodName();
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
}
@Before
public void initDatabase() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
runner.update(
conn,
"CREATE TABLE IF NOT EXISTS USER_INFO (userId VARCHAR(20) PRIMARY KEY, userName VARCHAR(50))");
}
@After
public void destory()
{
printCurrentMethodName();
DbUtils.closeQuietly(conn);
}
/**
* 打印當前運行方法名稱
*/
public void printCurrentMethodName()
{
System.out.println(Thread.currentThread().getStackTrace()[2]
.getMethodName());
System.out.println("==================================================");
}
}
在這段測試代碼中,我們是用h2作為數據庫進行測試以及定義了一些連接、數據庫的初始化及銷毀的方法。
在commons-dbutils中操作數據庫的常用類為:QueryRunner。 QueryRunner的常用方法如下:
| 返回值 | 方法名 | 說明 |
|---|---|---|
| int[] | batch(Connection conn, String sql, Object[][] params) | 批量執行INSERT、UPDATE或DELETE |
| int[] | batch(String sql, Object[][] params) | 批量執行INSERT、UPDATE或DELETE |
| T | insert(Connection conn, String sql, ResultSetHandler rsh) | 執行一個插入查詢語句 |
| T | insert(Connection conn, String sql, ResultSetHandler rsh, Object… params) | 執行一個插入查詢語句 |
| T | insert(String sql, ResultSetHandler rsh) | 執行一個插入查詢語句 |
| T | insert(String sql, ResultSetHandler rsh, Object… params) | 執行一個插入查詢語句 |
| T | insertBatch(Connection conn, String sql, ResultSetHandler rsh, Object[][] params) | 批量執行插入語句 |
| T | insertBatch(String sql, ResultSetHandler rsh, Object[][] params) | 批量執行插入語句 |
| T | query(Connection conn, String sql, ResultSetHandler rsh) | 查詢 |
| T | query(Connection conn, String sql, ResultSetHandler rsh, Object… params) | 查詢 |
| T | query(String sql, ResultSetHandler rsh) | 查詢 |
| T | query(String sql, ResultSetHandler rsh, Object… params) | 查詢 |
| int | update(Connection conn, String sql) | 執行INSERT、UPDATE或DELETE |
| int | update(Connection conn, String sql, Object… params) | 執行INSERT、UPDATE或DELETE |
| int | update(Connection conn, String sql, Object param) | 執行INSERT、UPDATE或DELETE |
| int | update(String sql) | 執行INSERT、UPDATE或DELETE |
| int | update(String sql, Object… params) | 執行INSERT、UPDATE或DELETE |
| int | update(String sql, Object param) | 執行INSERT、UPDATE或DELETE |
修改
我們先來看一下如何使用QueryRunner進行修改操作,在我們的測試代碼中添加測試方法:
@Test
public void update() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
String suffix = Long.toHexString(System.currentTimeMillis());
Integer result = runner.update(conn,
"insert into USER_INFO(userId, userName) values(?, ?)", suffix,
"name" + suffix);
System.out.println("受影響記錄條數:" + result);
修改的操作相比較而言還是很簡單的,在這段測試代碼中,我們向數據庫中添加了一條記錄,在QueryRunner中也是支持動態參數的,可以很方便的綁定參數
查詢
ScalarHandler
ScalarHandler會返回一個對象,用於讀取結果集中第一行指定列的數據。這里我們以查詢表中總記錄數為例:
@Test
public void queryByScalarHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Number number = runner.query(conn, "select count(*) from USER_INFO",
new ScalarHandler<Number>());
System.out.println("總記錄記錄條數:" + number.intValue());
}
不知大家有沒有發現,在ScalarHandler的泛型中,我使用的是Number,解釋一下:之前我在使用該方法查詢記錄條數的時候,不同的數據庫返回的數據類型可能不同,有的返回是Integer,而有的卻是Long,為了代碼的通用,所以在這里我使用了Number。
ArrayHandler
ArrayHandler會返回一個數組,用於將結果集第一行數據轉換為數組。
@Test
public void queryByArrayHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Object[] results = runner.query(conn, "select * from USER_INFO",
new ArrayHandler());
System.out.println(Arrays.asList(results));
}
ArrayListHandler
ArrayListHandler會返回一個集合,集合中的每一項對應結果集指定行中的數據轉換后的數組。
@Test
public void queryByArrayListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Object[]> results = runner.query(conn, "select * from USER_INFO",
new ArrayListHandler());
for (Object[] object : results)
{
System.out.println(Arrays.asList(object));
}
}
KeyedHandler
KeyedHandler會返回一個Map,我們可以指定某一列的值作為該Map的鍵,Map中的值為對應行數據轉換的鍵值對,鍵為列名。
@Test
public void queryByKeyedHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new KeyedHandler<String>());
System.out.println(results);
}
ColumnListHandler
ColumnListHandler會返回一個集合,集合中的數據為結果集中指定列的數據。
@Test
public void queryByColumnListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<String> results = runner.query(conn, "select * from USER_INFO",
new ColumnListHandler<String>());
System.out.println(results);
}
MapHandler
MapHandler會將結果集中第一行數據轉換為鍵值對,鍵為列名。
@Test
public void queryByMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Object> results = runner.query(conn,
"select * from USER_INFO", new MapHandler());
System.out.println(results);
}
MapListHandler
MapHandler會將結果集中的數據轉換為一個集合,集合中的數據為對應行轉換的鍵值對,鍵為列名
@Test
public void queryByMapListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new MapListHandler());
System.out.println(results);
}
BeanHandler
BeanHandler實現了將結果集第一行數據轉換為Bean對象,在實際應用中非常方便。
在編寫測試代碼之前,我們先來編寫一個對應的Bean類:
import java.text.MessageFormat;
public class UserInfo
{
private String userId;
private String userName;
public String getUserId()
{
return userId;
}
public void setUserId(String userId)
{
this.userId = userId;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
@Override
public String toString()
{
return MessageFormat
.format("[userId:{0},userName:{1}]", userId, userName);
}
}
接下來,我們來編寫測試代碼:
@Test
public void queryByBeanHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
UserInfo results = runner.query(conn, "select * from USER_INFO",
new BeanHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}
BeanListHandler
BeanHandler只轉換結果集的第一行,而BeanListHandler會將結果集的所有行進行轉換,返回一個集合。
@Test
public void queryByBeanListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<UserInfo> results = runner.query(conn, "select * from USER_INFO",
new BeanListHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}
BeanMapHandler
BeanMapHandler也會將結果集轉換為Bean對象,不過返回的是已指定列的值作為鍵的鍵值對。
@Test
public void queryByBeanMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, UserInfo> results = runner.query(conn,
"select * from USER_INFO", new BeanMapHandler<String, UserInfo>(
UserInfo.class));
System.out.println(results);
}
完整測試代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Arrays;
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.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.BeanMapHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.After;
import org.junit.Before;
public class DBUtilsTest
{
private Connection conn = null;
@Before
public void initConnection() throws SQLException, ClassNotFoundException
{
printCurrentMethodName();
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
}
@Before
public void initDatabase() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
runner.update(
conn,
"CREATE TABLE IF NOT EXISTS USER_INFO (userId VARCHAR(20) PRIMARY KEY, userName VARCHAR(50))");
}
public void update() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
String suffix = Long.toHexString(System.currentTimeMillis());
Integer result = runner.update(conn,
"insert into USER_INFO(userId, userName) values(?, ?)", suffix,
"name" + suffix);
System.out.println("受影響記錄條數:" + result);
}
public void queryByScalarHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Number number = runner.query(conn, "select count(*) from USER_INFO",
new ScalarHandler<Number>());
System.out.println("總記錄記錄條數:" + number.intValue());
}
public void queryByArrayHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Object[] results = runner.query(conn, "select * from USER_INFO",
new ArrayHandler());
System.out.println(Arrays.asList(results));
}
public void queryByArrayListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Object[]> results = runner.query(conn, "select * from USER_INFO",
new ArrayListHandler());
for (Object[] object : results)
{
System.out.println(Arrays.asList(object));
}
}
public void queryByKeyedHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new KeyedHandler<String>());
System.out.println(results);
}
public void queryByColumnListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<String> results = runner.query(conn, "select * from USER_INFO",
new ColumnListHandler<String>());
System.out.println(results);
}
public void queryByMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, Object> results = runner.query(conn,
"select * from USER_INFO", new MapHandler());
System.out.println(results);
}
public void queryByMapListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<Map<String, Object>> results = runner.query(conn,
"select * from USER_INFO", new MapListHandler());
System.out.println(results);
}
public void queryByBeanHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
UserInfo results = runner.query(conn, "select * from USER_INFO",
new BeanHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}
public void queryByBeanListHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
List<UserInfo> results = runner.query(conn, "select * from USER_INFO",
new BeanListHandler<UserInfo>(UserInfo.class));
System.out.println(results);
}
public void queryByBeanMapHandler() throws SQLException
{
printCurrentMethodName();
QueryRunner runner = new QueryRunner();
Map<String, UserInfo> results = runner.query(conn,
"select * from USER_INFO", new BeanMapHandler<String, UserInfo>(
UserInfo.class));
System.out.println(results);
}
@After
public void destory()
{
printCurrentMethodName();
DbUtils.closeQuietly(conn);
}
/**
* 打印當前運行方法名稱
*/
public void printCurrentMethodName()
{
System.out.println(Thread.currentThread().getStackTrace()[2]
.getMethodName());
System.out.println("==================================================");
}
}
https://blog.csdn.net/pdw2009/article/details/80932432
