MySQL和Oracle在对Clob和Blob字段的处理

MySQL和Oracle在对Clob和Blob字段的处理




前言


一、MySQL与Oracle数据库如何处理Clob,Blob数据类型

(1) 不通数据库中对应clob,blob的类型如下:
MySQL中:clob对应text,blob对应blob
DB2/Oracle中:clob对应clob,blob对应blob

(2) domain中对应的类型:
clob对应String,blob对应byte[]
clob对应java.sql.Clob,blob对应java.sql.Blob

(3) hibernate配置文件中对应类型:
clob–>clob ,blob–>binary
也可以直接使用数据库提供类型,例如:oracle.sql.Clob,oracle.sql.Blob

二、jdbc操作clob(以oracle为例)

1.插入操作

首先操作clob/blob不像操作varchar类型那样简单,插入步骤一般分为两步:第一步插入一个空值,第二步锁住此行,更新clob/blob字段。

//插入空值  
conn.setAutoCommit(false);  
String sql = "INSERT INTO T_FILE(NAME, FILE_CONTENT) VALUES ('Jambhala', EMPTY_CLOB())";  
PreparedStatement pstmt = conn.prepareStatement(sql);   
pstmt.executeUpdate();  
//锁住此行  
String sql_lockstr = "SELECT FILE_CONTENT FROM T_FILE WHERE NAME='Jambhala' FOR UPDATE";  
pstmt = conn.prepareStatement(sql_lockstr);   
ResultSet rs = pstmt.executeQuery();   
oracle.sql.Clob clob = (oracle.sql.Clob)rs.getClob(1);  
java.io.OutputStream writer = clob.getAsciiOutputStream();   
byte[] temp = newFileContent.getBytes();   
writer.write(temp);   
writer.flush();   
writer.close();  
pstmt.close();  

2. 读取操作

代码如下(示例):

oracle.sql.Clob clob = rs.getClob("FILE_CONTENT");  
if(clob != null){  
    Reader is = clob.getCharacterStream();  
    BufferedReader br = new BufferedReader(is);  
    String s = br.readLine();  
    while(s != null){  
        content += s+"<br>";  
        s = br.readLine();  
    }  
}  

三、jdbc操作blob

conn.setAutoCommit(false);  
String sql = "INSERT INTO T_PHOTO(NAME, PHOTO) VALUES ('Jambhala', EMPTY_BLOB())";  
pstmt = conn.prepareStatement(sql);   
pstmt = conn.executeUpdate();  
sql = "SELECT PHOTO FROM T_PHOTO WHERE NAME='Jambhala'";  
pstmt = conn.prepareStatement(sql);   
rs = pstmt.executeQuery(sql);  
if(rs.next()){  
   oracle.sql.Blob blob = (oracle.sql.Blob)rs.getBlob(1);  
}  
//write to a file  
File file=new File("C:\\test.rar");  
FileInputStream fin = new FileInputStream(file);  
OutputStream out = blob.getBinaryOutputStream();  
int count=-1,total=0;  
byte[] data = new byte[blob.getBufferSize()];  
while((count=fin.read(data)) != -1){  
   total += count;  
   out.write(data, 0, count);  
}   

四、hibernate处理clob

MyFile file = new MyFile();  
file.setName("Jambhala");  
file.setContent(Hibernate.createClob(""));  
session.save(file);  
session.flush();  
session.refresh(file, LockMode.UPGRADE);  
oracle.sql.Clob clob = (oracle.sql.Clob)file.getContent();  
Writer pw = clob.getCharacterOutputStream();  
pw.write(longText);   //写入长文本  
pw.close();  
session.close();  

五、使用hibernate处理blob

原理基本相同:

Photo photo = new Photo();  
photo.setName("Jambhala");  
photo.setPhoto(Hibernate.createBlob(""));  
session.save(photo);  
session.flush();  
  
session.refresh(photo, LockMode.UPGRADE);  //锁住此对象  
oracle.sql.Blob blob = photo.getPhoto();   //取得此blob的指针  
OutputStream out = blob.getBinaryOutputStream();  
//写入一个文件  
File f = new File("C:\\test.rar");  
FileInputStream fin = new FileInputStream(f);  
int count=-1,total=0;  
byte[] data = new byte[(int)fin.available()];  
out.write(data);  
fin.close();  
out.close();  
session.flush();  
  
  
String DRIVER = "oracle.jdbc.driver.OracleDriver";  
//Oracle连接用URL  
private static final String URL = "jdbc:oracle:thin:@testora:1521:orac";  
//用户名  
private static final String USER = "scott";  
//密码  
private static final String PASSWORD = "pswd";  
//数据库连接  
private static Connection conn = null;  
//SQL语句对象  
private static Statement stmt = null;  
//@roseuid 3EDA089E02BC  
public LobPros(){}  
  
//往数据库中插入一个新的Clob对象  
//@param infile  数据文件  
//@throws java.lang.Exception  
//@roseuid 3EDA089E02BC  
public static void clobInsert(String infile) throws Exception {  
   //设定不自动提交  
   boolean defaultCommit = conn.getAutoCommit();   
   conn.setAutoCommit(false);  
   try{  
    //插入一个空的Clob对象  
        stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");  
        //查询此Clob对象并锁定  
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
        while(rs.next()){  
       //取出此Clob对象  
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
           //向Clob对象中写入数据  
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());   
           BufferedReader in = new BufferedReader(new FileReader(infile));  
           int c;  
           while((c=in.read()) != -1){  
          out.write(c);  
           }  
           in.close();  
           out.close();  
        }  
        //正式提交  
        conn.commit();  
   }catch(Exception e){  
      //出错回滚  
      conn.rollback();  
      throw e;  
   }  
  
   //恢复原提交状态  
   conn.setAutoCommit(defaultCommit);  
}  
  
//修改Clob对象(是在原Clob对象基础上进行覆盖式的修改)  
//@param infile  数据文件  
//@throws java.lang.Exception  
//@roseuid 3EDA089E02BC  
public static void clobModify(String infile) throws Exception {  
   //设定不自动提交  
   boolean defaultCommit = conn.getAutoCommit();   
   conn.setAutoCommit(false);  
   try{  
    //查询Clob对象并锁定  
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
        while(rs.next()){  
       //获取此Clob对象  
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
           //进行覆盖式修改  
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());   
           BufferedReader in = new BufferedReader(new FileReader(infile));   
           int c;  
           while ((c=in.read())!=-1) {   
              out.write(c);   
           }   
           in.close();   
           out.close();   
        }  
        //正式提交  
        conn.commit();  
   }catch(Exception e){  
      //出错回滚  
      conn.rollback();  
      throw e;  
   }  
   //恢复原提交状态  
   conn.setAutoCommit(defaultCommit);  
}  
  
//替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象  
//@param infile  数据文件  
//@throws java.lang.Exception  
//@roseuid 3EDA04BF01E1  
public static void clobReplace(String infile) throws Exception {  
   //设定不自动提交  
   boolean defaultCommit = conn.getAutoCommit();  
   conn.setAutoCommit(false);  
   try{  
    //清空原CLOB对象  
        stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");  
        //查询CLOB对象并锁定  
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");  
        while (rs.next()) {  
       //获取此CLOB对象  
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
           //更新数据  
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());  
           BufferedReader in = new BufferedReader(new FileReader(infile));   
           int c;  
           while ((c=in.read())!=-1) {   
          out.write(c);   
       }   
       in.close();   
       out.close();  
        }  
    //正式提交  
    conn.commit();  
   }catch(Exception e){  
    //出错回滚  
    conn.rollback();   
    throw e;  
   }  
   //恢复原提交状态  
   conn.setAutoCommit(defaultCommit);  
}  
  
//CLOB对象读取  
//@param outfile  输出文件名  
//@throws java.lang.Exception  
//@roseuid 3EDA04D80116  
public static void clobRead(String outfile) throws Exception {  
   //设定不自动提交  
   boolean defaultCommit = conn.getAutoCommit();  
   conn.setAutoCommit(false);  
   try{  
        //查询CLOB对象  
        ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");  
        while (rs.next()) {  
       //获取CLOB对象  
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");  
           //以字符形式输出  
           BufferedReader in = new BufferedReader(clob.getCharacterStream());   
           BufferedWriter out = new BufferedWriter(new FileWriter(outfile));   
           int c;  
           while ((c=in.read())!=-1) {  
              out.write(c);  
           }  
       out.close();   
       in.close();  
        }  
   }catch(Exception e){  
       conn.rollback();   
       throw e;  
   }  
   //恢复原提交状态  
   conn.setAutoCommit(defaultCommit);  
}  
  
//向数据库中插入一个新的BLOB对象   
//@param infile  数据文件   
//@throws java.lang.Exception   
//@roseuid 3EDA04E300F6  
public static void blobInsert(String infile) throws Exception {   
   //设定不自动提交  
   boolean defaultCommit = conn.getAutoCommit();   
   conn.setAutoCommit(false);   
   try {   
    //插入一个空的BLOB对象   
    stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");   
    //查询此BLOB对象并锁定   
    ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
    while (rs.next()) {   
       //取出此BLOB对象   
       oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
       //向BLOB对象中写入数据   
       BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
       int c;   
       while ((c=in.read())!=-1) {   
        out.write(c);   
       }   
       in.close();   
       out.close();   
    }   
    //正式提交   
    conn.commit();   
    } catch (Exception e) {   
    //出错回滚   
    conn.rollback();   
    throw e;   
    }   
    //恢复原提交状态   
    conn.setAutoCommit(defaultCommit);   
}   
  
//修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)   
//@param infile  数据文件   
//@throws java.lang.Exception   
//@roseuid 3EDA04E90106   
public static void blobModify(String infile) throws Exception {   
    //设定不自动提交   
    boolean defaultCommit = conn.getAutoCommit();   
    conn.setAutoCommit(false);   
    try {   
    //查询BLOB对象并锁定   
    ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
    while (rs.next()) {   
       //取出此BLOB对象   
       oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
       //向BLOB对象中写入数据   
       BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
       int c;   
       while ((c=in.read())!=-1) {   
          out.write(c);   
       }   
       in.close();   
       out.close();   
    }   
    //正式提交   
    conn.commit();   
    } catch (Exception e) {   
    //出错回滚   
    conn.rollback();   
    throw e;   
    }   
    //恢复原提交状态   
    conn.setAutoCommit(defaultCommit);   
}   
  
//替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象)   
//@param infile  数据文件   
//@throws java.lang.Exception   
//@roseuid 3EDA0505000C   
public static void blobReplace(String infile) throws Exception {   
   //设定不自动提交   
   boolean defaultCommit = conn.getAutoCommit();   
   conn.setAutoCommit(false);   
   try {   
    //清空原BLOB对象   
    stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'");   
    //查询此BLOB对象并锁定   
    ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");   
    while (rs.next()) {   
       //取出此BLOB对象   
       oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
       //向BLOB对象中写入数据   
       BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());   
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));   
       int c;   
       while ((c=in.read())!=-1) {   
          out.write(c);   
       }   
       in.close();   
       out.close();   
        }   
    //正式提交   
    conn.commit();   
   } catch (Exception e) {   
    //出错回滚   
    conn.rollback();   
    throw e;   
   }   
   //恢复原提交状态   
   conn.setAutoCommit(defaultCommit);   
}   
  
//BLOB对象读取   
//@param outfile  输出文件名   
//@throws java.lang.Exception   
//@roseuid 3EDA050B003B   
public static void blobRead(String outfile) throws Exception {   
   //设定不自动提交   
   boolean defaultCommit = conn.getAutoCommit();   
   conn.setAutoCommit(false);   
   try {   
         //查询BLOB对象   
     ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");   
     while (rs.next()) {   
        //取出此BLOB对象   
        oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");   
        //以二进制形式输出   
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));   
        BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());   
        int c;   
        while ((c=in.read())!=-1) {   
           out.write(c);   
            }   
        in.close();   
        out.close();   
         }   
     //正式提交   
         conn.commit();   
   } catch (Exception e) {   
    //出错回滚   
    conn.rollback();   
    throw e;   
   }   
   //恢复原提交状态   
   conn.setAutoCommit(defaultCommit);   
}   
  
//建立测试用表格   
//@throws Exception   
public static void createTables() throws Exception {   
   try {   
    stmt.executeUpdate("CREATE TABLE TEST_CLOB (ID NUMBER(3), CLOBCOL CLOB)");   
    stmt.executeUpdate("CREATE TABLE TEST_BLOB (ID NUMBER(3), BLOBCOL BLOB)");   
   } catch (Exception e) { }   
}   
  
//@param args - 命令行参数   
//@throws java.lang.Exception   
//@roseuid 3EDA052002AC   
public static void main(String[] args) throws Exception {   
   //装载驱动,建立数据库连接   
   Class.forName(DRIVER);   
   conn = DriverManager.getConnection(URL,USER,PASSWORD);   
   stmt = conn.createStatement();   
   //建立测试表格   
   createTables();   
   //CLOB对象插入测试   
   clobInsert("c:/clobInsert.txt");   
   clobRead("c:/clobInsert.out");   
   //CLOB对象修改测试   
   clobModify("c:/clobModify.txt");   
   clobRead("c:/clobModify.out");   
   //CLOB对象替换测试   
   clobReplace("c:/clobReplace.txt");   
   clobRead("c:/clobReplace.out");   
   //BLOB对象插入测试   
   blobInsert("c:/blobInsert.doc");   
   blobRead("c:/blobInsert.out");   
   //BLOB对象修改测试   
   blobModify("c:/blobModify.doc");   
   blobRead("c:/blobModify.out");   
   //BLOB对象替换测试   
   blobReplace("c:/blobReplace.doc");   
   blobRead("c:/bolbReplace.out");   
   //关闭资源退出   
   conn.close();   
   System.exit(0);   
}  

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值