NO IMAGE

轉載請註明出處:http://blog.csdn.net/sunyujia/

在論壇上看到的一個問題,其實我從來沒有用過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包原始碼.

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

  1.     /**
  2.      *
  3.      * Description:建立Clob或者Blob
  4.      *
  5.      * @param conn資料庫連線物件
  6.      * @param lobClassName
  7.      *            oracle.sql.CLOB或者oracle.sql.BLOB
  8.      * @return oracle.sql.CLOB或者oracle.sql.BLOB物件
  9.      * @throws Exception
  10.      * @blog blog.csdn.ne t/sunyujia/
  11.      * @mail [email protected]
  12.      * @since:Oct 1, 2008 6:42:08 PM
  13.      */
  14.     public static Object createOracleLob(Connection conn, String lobClassName)
  15.             throws Exception {
  16.         Class lobClass = conn.getClass().getClassLoader().loadClass(
  17.                 lobClassName);
  18.         final Integer DURATION_SESSION = new Integer(lobClass.getField(
  19.                 “DURATION_SESSION”).getInt(null));
  20.         final Integer MODE_READWRITE = new Integer(lobClass.getField(
  21.                 “MODE_READWRITE”).getInt(null));
  22.         Method createTemporary = lobClass.getMethod(“createTemporary”,
  23.                 new Class[] { Connection.class, boolean.class, int.class });
  24.         Object lob = createTemporary.invoke(null, new Object[] { conn, false,
  25.                 DURATION_SESSION });
  26.         Method open = lobClass.getMethod(“open”, new Class[] { int.class });
  27.         open.invoke(lob, new Object[] { MODE_READWRITE });
  28.         return lob;
  29.     }
  30.     /**
  31.      *
  32.      * Description:將Clob物件轉換為String物件,Blob處理方式與此相同
  33.      *
  34.      * @param clob
  35.      * @return
  36.      * @throws Exception
  37.      * @mail [email protected]
  38.      * @blog blog.csdn.ne t/sunyujia/
  39.      * @since:Oct 1, 2008 7:19:57 PM
  40.      */
  41.     public static String oracleClob2Str(Clob clob) throws Exception {
  42.         return (clob != null ? clob.getSubString(1, (int) clob.length()) : null);
  43.     }
  44.     /**
  45.      *
  46.      * Description:將string物件轉換為Clob物件,Blob處理方式與此相同
  47.      *
  48.      * @param str
  49.      * @param lob
  50.      * @return
  51.      * @throws Exception
  52.      * @mail [email protected]
  53.      * @blog blog.csdn.ne t/sunyujia/
  54.      * @since:Oct 1, 2008 7:20:31 PM
  55.      */
  56.     public static Clob oracleStr2Clob(String str, Clob lob) throws Exception {
  57.         Method methodToInvoke = lob.getClass().getMethod(
  58.                 “getCharacterOutputStream”, (Class[]) null);
  59.         Writer writer = (Writer) methodToInvoke.invoke(lob, (Object[]) null);
  60.         writer.write(str);
  61.         writer.close();
  62.         return lob;
  63.     }
  64.     /**
  65.      *
  66.      * Description: 全部原始碼查考自
  67.      * org.springframework.jdbc.support.lob.OracleLobHandler
  68.      *
  69.      * @param args
  70.      * @throws Exception
  71.      * @mail [email protected]
  72.      * @blog blog.csdn.ne t/sunyujia/
  73.      * @since:Oct 1, 2008 7:26:16 PM
  74.      */
  75.     public static void main(String[] args) throws Exception {
  76.         //建立資料來源略
  77.         Connection conn = SqlUtil.getConnection();
  78.         Clob clob = (Clob) createOracleLob(conn, “oracle.sql.CLOB”);// BLOB的話傳oracle.sql.BLOB
  79.         // create table testTb (TheClob Clob);
  80.         PreparedStatement pstmt = conn
  81.                 .prepareStatement(“insert into testTb (TheClob) values (?)”);
  82.         pstmt.setClob(1, oracleStr2Clob(“test”, clob));
  83.         pstmt.execute();
  84.         SqlUtil.closeStmt(pstmt);
  85.         Statement stmt = conn.createStatement();
  86.         ResultSet rs = stmt.executeQuery(“select * from testTb”);
  87.         while (rs.next()) {
  88.             String str = oracleClob2Str(rs.getClob(1));
  89.             System.out.println(str);
  90.         }
  91.         SqlUtil.closeRs(rs);
  92.         SqlUtil.closeStmt(stmt);
  93.         SqlUtil.closeConn(conn);
  94.     }