设为首页 收藏本站
查看: 1029|回复: 0

[经验分享] 使用JDBC操作基于Oracle的CLOB,BLOB字段类型

[复制链接]

尚未签到

发表于 2018-9-23 07:17:02 | 显示全部楼层 |阅读模式
转载至程式先锋技术维客www.javabiz.cn  先来看看两种LOB类型的主要区别:
  CLOB 表示Character LOB (字符LOB)  它可以存储大量的字符数据。
  BLOB表示 Binary LOB(二进制LOB)。此数据类型的列可以存储大型二进制对象,如图形、视频剪辑和声音文件等。
  基本上我们可以得出这样的结论: 文本文件我们既可以使用BLOB也可以使用CLOB,二进制文件的存储我们只能使用BLOB类型.
  好,下面通过代码示例描述如何读取和写入LOB类型的字段:
  1. 先建一张表,具有三个字段:
  CREATE TABLE "ATTACHMENT" (
  "ID" VARCHAR2(10) NOT NULL,
  "MYCLOB" CLOB,
  "MYBLOB" BLOB,
  PRIMARY KEY("ID"));
  2. 准备两个文件用来存入数据库:
  c:/Test.java  用来代表文本文件
  C:/xx.jar  用来代表二进制数据
  3. 存储文本信息到CLOB字段中
  Connection conn = DBUtil.getConnection();
  conn.setAutoCommit(false);
  Statement stmt = conn.createStatement();
  //先初始化CLOB字段,此处为必须的操作,否则后面会产生空指针异常

  String initSql = "UPDATE ATTACHMENT SET MYCLOB=EMPTY_CLOB() WHERE>  //读取CLOB字段

  String updateSql = "SELECT MYCLOB FROM ATTACHMENT WHERE>  stmt.executeUpdate(initSql);
  ResultSet rs = stmt.executeQuery(updateSql);
  if (rs.next()) {
  CLOB clob = (CLOB) rs.getClob(1); //获取CLOB字段内容并转换为 oracle.sql.CLOB类型
  //获取CLOB的输出流
  Writer os = clob.getCharacterOutputStream();
  //读取文本文件
  BufferedReader br = new BufferedReader(new FileReader(new File(
  "c:/Test.java")));
  String line = br.readLine();
  StringBuffer buffer = new StringBuffer();
  while (line != null) {
  buffer.append(line);
  line = br.readLine();
  }
  os.write(buffer.toString());
  os.flush();
  br.close();
  os.close();
  conn.commit();
  conn.close();
  }
  System.out.println("Saved");
  在SQLPlus中测试一下文件有没有存入到数据库中,
  SQL>
  SQL> SELECT DBMS_LOB.GETLENGTH(MYCLOB) FROM ATTACHMENT;
  显示结果如下:
  DBMS_LOB.GETLENGTH(MYCLOB)
  --------------------------
  177
  这表明文件已经写入到这个MYCLOB字段中,如果没有存入的话,SQLPlus中不会显示任何数字(包括零也不会被显示), 现在可以进行下一步操作了
  4. 读取CLOB字段中的文本信息
  Connection conn = DBUtil.getConnection();
  Statement st = conn.createStatement();

  PreparedStatement preparedStatement = conn.prepareStatement("SELECT MYCLOB FROM ATTACHMENT WHERE>  ResultSet rs = preparedStatement.executeQuery();
  if (rs.next()) {
  //获取CLOB字段信息
  CLOB clob = (CLOB)rs.getClob("MYCLOB");
  BufferedReader br = new BufferedReader(clob.getCharacterStream());
  //创建输出流
  BufferedWriter out = new BufferedWriter(new FileWriter("C:/tttt.txt"));
  String line = br.readLine();
  while (line != null) {
  out.write(line);
  System.out.println(line);
  line = br.readLine();
  out.flush();
  }
  out.close();
  br.close();
  }
  rs.close();
  st.close();
  conn.close();
  5. 写入二进制信息到BLOB字段
  conn = DBUtil.getConnection();
  // 设置不自动提交
  conn.setAutoCommit(false);
  // 创建数据库操作语句
  statement = conn.createStatement();
  // 定义SQL语句

  statement.executeUpdate("UPDATE ATTACHMENT SET MYBLOB = EMPTY_BLOB() WHERE>  String strSQL = "SELECT MYBLOB FROM ATTACHMENT WHERE ROWNUM = 1 FOR UPDATE";
  resultset = statement.executeQuery(strSQL);
  BLOB contents = null;
  while (resultset.next()) {
  // 取出BLOB对象
  contents = (oracle.sql.BLOB) resultset.getBlob(1);
  }
  OutputStream out = contents.getBinaryOutputStream();
  FileInputStream in = new FileInputStream(new File("c:/XX.jar"));
  //将输出流和输入流对转
  FileUtil.copy(in, out);
  out.close();
  in.close();
  // 数据库提交
  conn.commit();
  conn.close();
  同样,这里我们也在SQLPlus中测试一下BLOB字段中是否已经含有数据:
  SQL>
  SQL> SELECT DBMS_LOB.GETLENGTH(MYBLOB) FROM ATTACHMENT;
  显示结果如下:
  DBMS_LOB.GETLENGTH(MYBLOB)
  --------------------------
  211
  表明已经存入数据,数据的大小是21.1k, 现在可以进行读取操作了
  6. 读取BLOB字段中内容并存储到一个文件中
  Connection conn = DBUtil.getConnection();
  conn.setAutoCommit(false);
  PreparedStatement preparedStatement = conn
  .prepareStatement("SELECT DATA FROM ATTACH WHERE ROWNUM=1");
  ResultSet rs = preparedStatement.executeQuery();
  if (rs.next()) {
  Blob blob = rs.getBlob(1);
  if (blob != null) {
  InputStream is = ((BLOB) blob).getBinaryStream();
  // ((CLOB) clob).getCharaterStream();
  FileOutputStream fos = new FileOutputStream(new File(
  "c:/abc.jar"));
  FileUtil.copy(is, fos);
  fos.close();
  is.close();
  }
  }
  rs.close();
  preparedStatement.close();
  conn.close();
  输出: c盘的根目录下应该出现了一个abc.jar 的文件, 你可以根据字节数和xx.jar比较一下,应该完全相同.
  上述步骤是使用了示例代码展示了如何操作Oracle中LOB字段类型,如果需要本文中的全部源代码请发送邮件到info@javabiz.cn


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600061-1-1.html 上篇帖子: (转oracle11.2.0.3.0下载链接 下篇帖子: Linux AS4.6 成功安装Oracle9i-gzh
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表