mysql和Oracle在对clob和blob字段的处理

摘要:
1、 MySQL和Oracle数据库如何处理Clob?blob数据类型不同。数据库中对应的clob对应于clob。blob类型如下:在MySQL中:clob对应于文本,blob对应于blobDB2/Oracle:clob相应于clob,blob相应于blobdomain中的类型:clob相当于String,blob相当于byte[]clob对应java。sql。blob,blob对应于java。sql Blobhibernate配置文件中的相应类型:Clob--˃Clob,blob--˃binary也可以直接使用数据库提供类型,如oracle。sql。clob,预言家。jdbc操作clob首先操作clob/Blob,这不像varchar类型的操作那么简单。插入步骤通常分为两步:第一步是插入空值,第二步是锁定行并更新clob/blob字段。
一、MySQLOracle数据如何处理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为例)
首先操作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();
读取内容:
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   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   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   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   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   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   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); 
}

免责声明:文章转载自《mysql和Oracle在对clob和blob字段的处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js中对表格的操作总结conda环境复制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DELPHI字符串、数组操作函数(转)

对字符串及数组的操作,是每个程序员必须要掌握的。熟练的使用Delphi的这些函数,在编程时能更加得心应手。   1.Copy   功能说明:该函数用于从字符串中复制指定范围中的字符。该函数有3个参数。第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(   即个数)。最后函数返回一个新的字符串(即是我...

Oracle 建立索引及SQL优化

数据库索引: 索引有单列索引复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。  2、对于两表连接的字段,应该建立索...

java中的静态导入

     java中的静态导入他是jdk5.0的新特性,所谓静态导入就是不使用类名.属性名,类名.方法名的形式去调用属性或方法,而是通过静态导入,直接使用方法名和属性。 静态导入的语法: import static 包名.类名.静态成员变量; import static 包名.类名.静态成员函数; 下面来看一个例子: 1.自定义一个类,给一个成员变量,给一...

聊聊OkHttp实现WebSocket细节,包括鉴权和长连接保活及其原理!

一、序 OkHttp 应该算是 Android 中使用最广泛的网络库了,我们通常会利用它来实现 HTTP 请求,但是实际上它还可以支持 WebSocket,并且使用起来还非常的便捷。 那本文就来聊聊,利用 OkHttp 实现 WebSocket 的一些细节,包括对 WebSocket 的介绍,以及在传输前如何做到鉴权、长连接保活及其原理。 二、WebSo...

eclipse&amp;amp;myeclipse 生成jar包后,spring无法扫描到bean定义

问题:eclipse&myeclipse 生成jar包后,spring无法扫描到bean定义 在使用getbean或者扫包时注入bean失败,但在IDE里是可以正常运行的? 原因:导出jar未将目录一起导出。 解决方法:将代码目录一起导出:一定要勾选 Add directory enttries 区别: 代码结构: 未勾选,导出内容为: MET...

C#操作word模板

    string newDocFileName = Guid.NewGuid().ToString().Replace("-", "");        string strServerPath = Server.MapPath("") + "\\Model.doc";  //模板路径        string strSavePath = Serve...