1. 程式人生 > >字串長度超過4000字元的資料存入oracle資料庫裡clob型別的欄位裡,並之後做前臺查詢展示

字串長度超過4000字元的資料存入oracle資料庫裡clob型別的欄位裡,並之後做前臺查詢展示

這個過程會產生的問題有:

1. 因為oracle的兩個單引號之間字元長度不能超過4000,字串長度超過4000字元後或報字元過長的錯,無法直接insert或update進資料庫,必須得轉換成clob型別。

2.查出來的clob資料不是字串,無法直接展示。

我在ssm框架環境下的實現是

insert或update的時候通過mybatis框架封裝好的String轉換clob型別的方式進行轉換,再做資料庫操作

mybatis是通過#{,jdbcType=..}來轉換型別的,這樣我們就不用重新寫轉換型別方法了。

在查詢的時候,直接查clob型別的欄位會給我返回一個[email protected]

這樣型別的值,有兩種方法可以解決

1)在查出來字串長度小於4000的時候可以用dbms_lob.substr(clob_column)這個oracle內建的函式進行clob轉字串操作。

2)在查出字串長度大於4000的時候,就需要一個 clob轉換string的方法了:

    public String ClobToString(Clob clob) throws SQLException, IOException {

      String reString = "";

      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();

      }

      reString = sb.toString();

      if(br!=null){

          br.close();

      }

      if(is!=null){

          is.close();

      }

      return reString;

     }

通過上面這段程式碼可以直接把clob轉成字串。

我在String轉clob的時候也查了網上很多的說法,有的說用java來轉,轉了以後在存到資料庫裡,看了一下,大概的意思就是說先建立一個clob物件,再把長字串放到clob物件裡進行轉換,這種方法也是能實現的,就是沒有那麼方便,還有的說用儲存過程,

DECLARE REALLYBIGTEXTSTRING CLOB := '待插入的海量字串'; BEGIN INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0'); end ; / commit;

我試了一下沒有起作用就放棄了。所以覺得最方便實現的就是由mybatis的轉換。

看了一下mybatis轉換型別的實現是這樣說的:

mapping.typeHandler.getResult會獲取查詢結果值的實際型別,比如我們user表中id欄位為int型別,那麼它就對應Java中的Integer型別,然後通過呼叫statement.getInt("id")來獲取其int值,其型別為Integer。metaObject.setValue方法會把獲取到的Integer值設定到Java類中的對應欄位。

所以最後我通過這樣的流程實現clob資料的查,新增,修改或把查出來的資料再累加新的字串再update到資料庫裡等等操作。