使用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 handleRow(ResultSet rs) throws SQLException {
        // TODO Auto-generated method stub
        Map 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;
    }
}

你可能感兴趣的:(自动化测试)