使用DBUtils獲取Blob類型數據

DBUtils的三個核心類

  1. DBUtils

    • 介紹:連接數據庫對象—-jdbc輔助方法的集合類,線程安全
    • 功能:控制連接,控制書屋,控制驅動加載額一個類。
    • 構造函數:
DbUtils()
  1. QueryRunner
    • 介紹:使用插拔策略執行SQL查詢,線程安全。
    • 構造函數:
QueryRunner()
QueryRunner(boolean pmdKnownBroken)
QueryRunner(DataSource ds)
QueryRunner(DataSource ds,boolean pmdKnownBroken)
  1. ResultSetHandler
    • 介紹:封裝數據的策略對象。將封裝結果集中的數據,轉換到另一個對象
    • 方法:
handleResultSet rs)

ResultSetHandler實現類介紹

ArrayHandler     :將ResultSet中第一行的數據轉化成對象數組

ArrayListHandler :將ResultSet中所有的數據轉化成ListList中存放的是Object[]

BeanHandler      :將ResultSet中第一行的數據轉化成類對象

BeanListHandler  :將ResultSet中所有的數據轉化成ListList中存放的是類對象

ColumnListHandler:將ResultSet中某一列的數據存成ListList中存放的是Object對象

KeyedHandler     :將ResultSet中存成映射,key爲某一列對應爲MapMap中存放的是數據

MapHandler       :將ResultSet中第一行的數據存成Map映射

MapListHandler   :將ResultSet中所有的數據存成ListList中存放的是Map

ScalarHandler    :將ResultSet中一條記錄的其中某一列的數據存成Object

上述這些DBUtils提供的實現類,如果無法滿足需求,也可以自己實現。

重新實現ResultSetHandler

如果表字段中有Blob類型,直接用DBUtils提供的MapListHandler,讀出來的數據是亂碼,這個時候可以重寫MapListHandler。先判斷字段類型,如果是BLOB類型,則轉成String。如果還有其他複雜類型,也可以加入判斷,並轉化。

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

    @Override
    protected Map<String, Object> handleRow(ResultSet rs) throws SQLException {
        // TODO Auto-generated method stub
        Map<String, Object> result = new CaseInsensitiveMap();
        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();
        for (int i = 1; i <= cols; i++) {
            //通過ResultSetMetaData類,可判斷該列數據類型
//          System.out.println("columnName:"+rsmd.getColumnName(i)+"-----columnTypeName:"+rsmd.getColumnTypeName(i));
            if(rsmd.getColumnTypeName(i).equals("BLOB")){
                Blob bb = rs.getBlob(i);
                if(bb!=null) {                  
                    byte[] b = bb.getBytes(1, (int)bb.length());
                    String blobStr = "";
                    try {
                        blobStr = new String(ZipUtil.deflateUncompress(b), "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //將結果放到Map中
                    result.put(rsmd.getColumnName(i), blobStr);
                }
            }else {
                //如果不是BLOB類型,則直接放進Map
                result.put(rsmd.getColumnName(i), rs.getObject(i));
            }
        }   
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章