commons-dbutils使用介紹,commons-dbutils是JDBC的替代品


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM