java读取blob全身乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();  

 

以上是关于java读取blob全身乱码的主要内容,如果未能解决你的问题,请参考以下文章

python 读取oracle BLOB二进制乱码问题

python 读取oracle BLOB二进制乱码问题

servlet网页显示MySQL BLOB中文乱码

如何在java中读取oracle blob

java 逐行读取txt文本如何解决中文乱码

java读取blob并用base64码进行保存