講解Oracle中的Clob與String類型轉換

來源:互聯網
上載者:User

  在論壇上看到的一個問題,其實我從來沒有用過Clob,因為確實沒這個需求,但是為了搶分,如何最快的找到解決方案呢,第一時間想到spring,因為spring對orm工具有封裝, 像ibatis,hibernate等,在spring.jar中大概翻了一下包,根據包名和類名發現如下可疑類org.springframework.orm.ibatis.support.ClobStringTypeHandler 根據源碼跟蹤到了 org.springframework.jdbc.support.lob.OracleLobHandler 這個類才是內有乾坤,有我想要的一切東西,嘿嘿,不好意思了,統統抄來.

  在spring包中有個org.springframework.jdbc.support.lob.AbstractLobHandler這裡面定義了基本的Clob和Blog處理方法

  org.springframework.jdbc.support.lob.DefaultLobHandler是預設的實現,除了Oracle其他資料庫使用此實現

  org.springframework.jdbc.support.lob.OracleLobHandler是專門用於Oracle的實現,可見Oracle的BT,為了不造成直接包依賴,相關的調用都是利用反射完成的.有興趣的朋友可以去閱讀下這兩個類,以便瞭解Oracle的特殊性.

  經過分析,將Clob的建立,以及與String的互轉代碼放出來供大家使用.當然不可能完全copy了,我做了些簡化處理,不過已經測試了,沒用問題.更多細節請查閱spring的org.springframework.jdbc.support.lob包源碼.

  來源:(http://blog.sina.com.cn/s/blog_5109612b0100aq6l.html) - Oracle中的Clob與String類型轉換_鐳射頭_新浪部落格

  SqlUtil類是我為了方便測試寫的,大家靠代碼就能夠猜出來其內容了,所以就不全貼了,只貼本文的主題部分.

  public static Object createOracleLob(Connection conn, String lobClassName)
  throws Exception {
  Class lobClass = conn.getClass().getClassLoader().loadClass(
  lobClassName);
  final Integer DURATION_SESSION = new Integer(lobClass.getField(
  ”DURATION_SESSION”).getInt(null));
  final Integer MODE_READWRITE = new Integer(lobClass.getField(
  ”MODE_READWRITE”).getInt(null));
  Method createTemporary = lobClass.getMethod(”createTemporary”,
  new Class[] { Connection.class, boolean.class, int.class });
  Object lob = createTemporary.invoke(null, new Object[] { conn, false,
  DURATION_SESSION });
  Method open = lobClass.getMethod(”open”, new Class[] { int.class });
  open.invoke(lob, new Object[] { MODE_READWRITE });
  return lob;
  }
  public static String oracleClob2Str(Clob clob) throws Exception {
  return (clob != null ? clob.getSubString(1, (int) clob.length()) : null);
  }
  public static Clob oracleStr2Clob(String str, Clob lob) throws Exception {
  Method methodToInvoke = lob.getClass().getMethod(
  ”getCharacterOutputStream”, (Class[]) null);
  Writer writer = (Writer) methodToInvoke.invoke(lob, (Object[]) null);
  writer.write(str);
  writer.close();
  return lob;
  }
  public static void main(String[] args) throws Exception {
  //建立資料來源略
  Connection conn = SqlUtil.getConnection();
  Clob clob = (Clob) createOracleLob(conn, ”oracle.sql.CLOB”);// BLOB的話傳oracle.sql.BLOB
  // create table testTb (TheClob Clob);
  PreparedStatement pstmt = conn
  .prepareStatement(”insert into testTb (TheClob) values (?)”);
  pstmt.setClob(1, oracleStr2Clob(”test”, clob));
  pstmt.execute();
  SqlUtil.closeStmt(pstmt);
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery(”select * from testTb”);
  while (rs.next()) {
  String str = oracleClob2Str(rs.getClob(1));
  System.out.println(str);
  }
  SqlUtil.closeRs(rs);
  SqlUtil.closeStmt(stmt);
  SqlUtil.closeConn(conn);
  }

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.