• 静思
  • 吴言片语
    • 吴言
    • 片语
    • 杂七杂八
  • 死于青春
    • 一路走好
  • 乌合麒麟
  • 纪念
    • 5.12
    • 3.23
  • GitHub
    • A List of Post-mortems
    • The Art of Command Line
  • 关于
    • Privacy Policy

程序员的信仰

金鳞岂是池中物,一遇风云便化龙

HOME » 技术生活 » 在Java中使用Oracle blob

在Java中使用Oracle blob

2005 年 1 月 10 日 @ 下午 2:04 by Jay | 被踩了 2,510 脚

Oracle中的lob (Large Object)可以存储非常大的数据(可能是4GB),这样就可以通过将文件或其它任何对象序列化成字节输出流(OutputStream)后写入数据库,之后使用字节输入流(InputStream)将数据读出然后反序列化为原始文件或对象。操作时需要使用oracle的JDBC包,它扩展了sun的JDBC包中的Blob对象。同时需要注意一些细节。下面的代码演示如何使用blob(实例中需要Oracle的JDBC包)。

import oracle.jdbc.OracleResultSet; // 使用Oracle的ResultSet对象
import oracle.sql.BLOB; // 使用Oracle的BLOB对象,而不是sun的Blob

...

try{
  Connection conn = <数据库连接>;
  File file = <存入数据库的文件对象>;
  conn.setAutoCommit(false); // 取消Connection对象的auto commit属性
  String file_name = file.getName();

  // 数据库中有一个item表,其中的file_name (varchar2)存储文件名,file_blob (blob)存储文件对象
  String sql = "INSERT INTO item (file_name,file_blob) VALUES ('" + file_name + "',EMPTY_BLOB())"; // 使用“EMPTY_BLOB()“成生一个空blob
  Statement stmt = conn.createStatement();
  int count = stmt.executeUpdate(sql);
  
  sql = "SELECT file_blob FROM item WHERE iid='" + iid + "' FOR UPDATE"; // 使用“FOR UPDATE”得到表的写锁
  ResultSet rs = stmt.executeQuery(sql);
  rs.next();

  BLOB blob = ((OracleResultSet)rs).getBLOB("file_blob"); // 得到BLOB对象
  OutputStream out = blob.getBinaryOutputStream(); // 建立输出流
  InputStream in = new FileInputStream(file); // 建立输入流
  int size = blob.getBufferSize();
  byte[] buffer = new byte[size]; // 建立缓冲区

  int len;
  while((len = in.read(buffer)) != -1)
    out.write(buffer,0,len);

  in.close();
  out.close();

  conn.commit();
} catch(Exception ex) {
  try {
    conn.rollback();
  } catch(SQLException sqle) {
    System.err.println(sqle.getMessage());
  }
}

如果要读出文件的话只需调用BLOB的getBinaryStream()生成一个输入流,再写入一个文件就行了。



-- EOF --
除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:在Java中使用Oracle blob

分享

  • 点击分享到 Facebook (在新窗口中打开) Facebook
  • 点击以分享到 X(在新窗口中打开) X
  • 更多
  • 点击分享到Reddit(在新窗口中打开) Reddit
  • 点击分享到Telegram(在新窗口中打开) Telegram
  • 点击以在 Mastodon 上共享(在新窗口中打开) Mastodon

赞过:

赞 正在加载……

相关

Posted in: 技术生活 Tagged: java, jdbc, oracle, sql
← Scanning Text With java.util.Scanner
常用非标准库 →

android (9) apple (20) augmentum (9) Beijing (21) bt (8) career (28) coding (38) firefox (10) google (36) hibernate (11) ibm (11) iphone (10) java (93) linux (16) m$ (26) mac (58) macos (27) nazca (9) olympics (8) oo (8) playstation (10) rip (8) Shanghai (39) spring (9) tips (45) tommy emmanuel (8) ubuntu (12) usa (23) windows (9) 北航 (17) 博客 (29) 吐槽 (8) 周末 (9) 和谐社会 (26) 小资 (11) 愤青 (40) 方言 (10) 朋友 (77) 歌词 (8) 烟酒不分家 (18) 爱国 (19) 爱情 (8) 犯二 (15) 破解 (8) 足球 (11)

烫手山芋

  • 再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~ - 被踩了 27,936 脚
  • 生活,就是一个期待跟着一个期待 - 被踩了 21,443 脚
  • 星巴克饮品缩写大全(Starbucks Drink ID Codes)[zz] - 被踩了 18,669 脚
  • 从一个全角冒号说一下我为什么不感冒iOS - 被踩了 14,572 脚
  • 有关Character.isLetter()和Character.isLetterOrDigit() - 被踩了 13,693 脚

刚拍的砖

  • leo 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 花 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 无名氏 发表在《从一个全角冒号说一下我为什么不感冒iOS》
  • Jay 发表在《Mac OS geek级问题》
  • Wei Wang 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》

随便看看

  • 搬了3 年 ago
  • 哥们儿,一路走好5 年 ago
  • 很美 [zz]17 年 ago
  • 思想殖民——美国认知战的手段、根源及国际危害3 月 ago
  • 谈技术人员“转正” [zz]12 年 ago

文以类聚

光阴似箭

其他操作

  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

Copyright © 2025 程序员的信仰.

Jay's Omega WordPress Theme by Jay

 

正在加载评论...
 

    %d