java讀取blob全身亂碼


一、BLOB操作  
1、入庫  
(1)JDBC方式  
    //通過JDBC獲得數據庫連接   
    Class.forName("oracle.jdbc.driver.OracleDriver");  
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //插入一個空對象empty_blob()   
    st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");  
    //鎖定數據行進行更新,注意“for update”語句   
    ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");  
    if (rs.next())  
    {  
        //得到java.sql.Blob對象后強制轉換為oracle.sql.BLOB   
        oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");  
        OutputStream outStream = blob.getBinaryOutputStream();  
        //data是傳入的byte數組,定義:byte[] data   
        outStream.write(data, 0, data.length);  
    }  
    outStream.flush();  
    outStream.close();  
    con.commit();  
    con.close();  
(2)JNDI方式  
    //通過JNDI獲得數據庫連接   
    Context context = new InitialContext();  
    ds = (DataSource) context.lookup("ORA_JNDI");  
    Connection con = ds.getConnection();  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //插入一個空對象empty_blob()   
    st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");  
    //鎖定數據行進行更新,注意“for update”語句   
    ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");  
    if (rs.next())  
    {  
        //得到java.sql.Blob對象后強制轉換為weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server對應的可能會不同)   
        weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");  
        OutputStream outStream = blob.getBinaryOutputStream();  
        //data是傳入的byte數組,定義:byte[] data   
        outStream.write(data, 0, data.length);  
    }  
    outStream.flush();  
    outStream.close();  
    con.commit();  
    con.close();  
2、出庫  
    //獲得數據庫連接   
    Connection con = ConnectionFactory.getConnection();  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //不需要“for update”   
    ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");  
    if (rs.next())  
    {  
        java.sql.Blob blob = rs.getBlob("BLOBATTR");  
        InputStream inStream = blob.getBinaryStream();  
        //data是讀出並需要返回的數據,類型是byte[]   
        data = new byte[input.available()];  
        inStream.read(data);  
        inStream.close();  
<pre class="java" name="code">conn = this.getConnection();  
            conn.setAutoCommit(false);  
            java.sql.Statement st = conn.createStatement();  
            rs= st.executeQuery(sql);  
     BLOB inblob = null;  
     if (rs.next()) {  
    inblob = (BLOB) rs.getBlob("BLOBATTR");  
    }  
     data=inblob.getBytes(1,(int)inblob.length());//這個就是數據    
    }  
    inStream.close();  
    con.commit();  
    con.close();  
   
二、CLOB操作  
1、入庫  
(1)JDBC方式  
    //通過JDBC獲得數據庫連接   
    Class.forName("oracle.jdbc.driver.OracleDriver");  
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //插入一個空對象empty_clob()   
    st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");  
    //鎖定數據行進行更新,注意“for update”語句   
    ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");  
    if (rs.next())  
    {  
        //得到java.sql.Clob對象后強制轉換為oracle.sql.CLOB   
        oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");  
        Writer outStream = clob.getCharacterOutputStream();  
        //data是傳入的字符串,定義:String data   
        char[] c = data.toCharArray();  
        outStream.write(c, 0, c.length);  
    }  
    outStream.flush();  
    outStream.close();  
    con.commit();  
    con.close();  
(2)JNDI方式  
    //通過JNDI獲得數據庫連接   
    Context context = new InitialContext();  
    ds = (DataSource) context.lookup("ORA_JNDI");  
    Connection con = ds.getConnection();  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //插入一個空對象empty_clob()   
    st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");  
    //鎖定數據行進行更新,注意“for update”語句   
    ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");  
    if (rs.next())  
    {  
        //得到java.sql.Clob對象后強制轉換為weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server對應的可能會不同)   
        weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");  
        Writer outStream = clob.getCharacterOutputStream();  
        //data是傳入的字符串,定義:String data   
        char[] c = data.toCharArray();  
        outStream.write(c, 0, c.length);  
    }  
    outStream.flush();  
    outStream.close();  
    con.commit();  
    con.close();  
2、出庫  
    //獲得數據庫連接   
    Connection con = ConnectionFactory.getConnection();  
    con.setAutoCommit(false);  
    Statement st = con.createStatement();  
    //不需要“for update”   
    ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");  
    if (rs.next())  
    {  
        java.sql.Clob clob = rs.getClob("CLOBATTR");  
        Reader inStream = clob.getCharacterStream();  
        char[] c = new char[(int) clob.length()];  
        inStream.read(c);  
        //data是讀出並需要返回的數據,類型是String   
        data = new String(c);  
        inStream.close();  
    }  
    inStream.close();  
    con.commit();  
    con.close();  
   
需要注意的地方:  
1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob幾種類型的區別  
2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob幾種類型的區別   
公司項目中的用法(博客):  
入庫:先插一個oracle.sql.CLOB.empty_lob()進去,然后  
String updateBaseSourceSql = "select content from mb_baseSource where id = ? for update";  
    conn.setAutoCommit(false);  
    ps = conn.prepareStatement(updateBaseSourceSql);  
    ps.setLong(1, result);  
    ResultSet rs = ps.executeQuery();  
    oracle.sql.CLOB clob = null;  
    if (rs.next()) {  
     clob = (oracle.sql.CLOB) rs.getClob(1);  
    }  
    Writer wr = clob.getCharacterOutputStream();  
    wr.write(baseSource[4]);  
    wr.flush();  
    wr.close();  
    rs.close();  
    ps.close();  
    conn.commit();  
出庫:  
findBaseSourceSql = "select content from mb_baseSource where id = ?";  
   ps = conn.prepareStatement(findBaseSourceSql);  
   ps.setLong(1, sourceID);  
   rs = ps.executeQuery();  
   if (rs.next()) {  
    CLOB clob = (oracle.sql.CLOB) rs.getClob(1);  
    if (clob != null) {  
     Reader is = clob.getCharacterStream();  
     BufferedReader br = new BufferedReader(is);  
     String s = br.readLine();  
     while (s != null) {  
      result[6] += s;  
      s = br.readLine();  
     }  
    }  
   }  
   rs.close();  
   ps.close();  
   conn.close();  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM