一、前言
我们有时候查询oracle语句的时候,oracle有些字段是大字段Clob类型,这样的数据我们第一种方式是可以通过to_char(clob字段)将数据查出来,那如果我们直接查询的话,在java层应该怎么处理clob字段呢
二、处理方式
第一种方式(不建议,有小缺陷):拼接数据流
可以通过stream流将clob字段,拼接起来,这样对于一些简单的数据是没有问题的,但是有时候会碰到clob字段的数据,带一些特殊字符,比如换行、空格等格式的话,解析出来的数据是不带空格和换行的,那这样的数据就是有问题的,和原来的不符合
@SneakyThrows private String clobToString(Clob clob){ String res= ""; Reader is = clob.getCharacterStream(); BufferedReader br = new BufferedReader(is); String s = br.readLine(); StringBuffer sb = new StringBuffer(); while (s != null) { sb.append(s); s = br.readLine(); } res= sb.toString(); if (br!=null){ br.close(); } if (is!=null){ is.close(); } return res; }
第二种方式(推荐):getSubString
可以直接通过clob的提供的方法进行处理,非常的方便,但是一定要注意判空,通过下面的这种方式处理,即使有换行、空格等特殊字符出现的时候,都能够原模原样的保存到新的字段当中
比如判空处理:
dataMap.get("clobcloumn") == null ? "" : StringUtils.substring(ComUtils.clobToString((Clob) dataMap.get("clobcloumn")), 0, 1333)
截取1333是为了保存到新的字段varchar2(4000)的时候,避免超出长度
clobToString()方法:
/** * Clob字段处理 * * @param clob * @return */ public static String clobToString(Clob clob) { String content = ""; try { content = clob.getSubString((long) 1, (int) clob.length()); } catch (Exception e) { log.error("转换异常:", e); } return content; }