oracle存储大数据类型(Clob/Blob)

oracle本身支持对大数据类型的各种处理,但是平常大家可能用的不多,其中clob(一般用于大类型的字符型的存取)和blob(一般用于大类型的二进制类型的存取)我想应该就是用的比较少的。所以我写下这篇博文,主要是对这两个数据类型的文件进行的操作,如,保存这类文件进入数据库,读取这类文件到本地磁盘。

本来按照老习惯是该先上效果图的,可惜我的机器现在巨卡,10g跑起来基本让我泪流满面,所以我就偷下懒,图就给省略了 -_-!

第一步,新建一个java项目(为啥是java项目而不是web呢,主要因为它便于测试,出效果也快...)orclTest

第二步,新建一个数据库连接的类,我这里是com.test.InitDB.java,代码如下:

Java代码
  1. classInitDB{
  2. privatestaticConnectioncon=null;
  3. privatestaticStatementstmt=null;
  4. privatestaticResultSetrs=null;
  5. //链接oracle数据库
  6. InitDB()
  7. {
  8. try
  9. {
  10. Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
  11. Stringurl="jdbc:oracle:thin:@localhost:1521:YYSMID";
  12. Stringuser="zhangsan";
  13. Stringpassword="Lc123456";
  14. con=(Connection)DriverManager.getConnection(url,user,password);
  15. InitDB.setCon(con);
  16. }
  17. catch(Exceptione)
  18. {
  19. e.printStackTrace();
  20. }
  21. }
  22. publicvoidclosCon()
  23. {
  24. try
  25. {
  26. con.close();
  27. }
  28. catch(Exceptione)
  29. {
  30. e.printStackTrace();
  31. }
  32. }
  33. publicvoidstmt()
  34. {
  35. try
  36. {
  37. con.close();
  38. }
  39. catch(Exceptione)
  40. {
  41. e.printStackTrace();
  42. }
  43. }
  44. publicvoidrs()
  45. {
  46. try
  47. {
  48. con.close();
  49. }
  50. catch(Exceptione)
  51. {
  52. e.printStackTrace();
  53. }
  54. }
  55. publicstaticConnectiongetCon()
  56. {
  57. returncon;
  58. }
  59. publicstaticvoidsetCon(Connectioncon)
  60. {
  61. InitDB.con=con;
  62. }
  63. publicstaticResultSetgetRs()
  64. {
  65. returnrs;
  66. }
  67. publicstaticvoidsetRs(ResultSetrs)
  68. {
  69. InitDB.rs=rs;
  70. }
  71. publicstaticStatementgetStmt()
  72. {
  73. returnstmt;
  74. }
  75. publicstaticvoidsetStmt(Statementstmt)
  76. {
  77. InitDB.stmt=stmt;
  78. }
  79. }

第三步,以及接下来的几步,我们来分别编写clob和blob的插入数据库和读出数据库的代码,新建com.test.InsertBlobData.java,顾名思义,它是用来插入blob类型数据的类。代码如下:

Java代码
Java代码
  1. classInsertBlobData{
  2. privateResultSetrs=null;
  3. privateInitDBidb=null;
  4. InsertBlobData()
  5. {
  6. idb=newInitDB();
  7. }
  8. publicvoidinsertBlob(Stringsql1)throwsSQLException
  9. {
  10. Connectioncon=idb.getCon();
  11. try
  12. {
  13. con.setAutoCommit(false);//不设置自动提交
  14. BLOBblob=null;//插入空的Blob
  15. PreparedStatementpstmt=con
  16. .prepareStatement("insertintocdl_test(sid,img)values(?,empty_blob())");
  17. pstmt.setString(1,"100");
  18. pstmt.executeUpdate();
  19. pstmt.close();
  20. rs=con.createStatement().executeQuery(sql1);
  21. while(rs.next())
  22. {
  23. System.out.println("rslengthis:");
  24. oracle.sql.BLOBb=(oracle.sql.BLOB)rs.getBlob("img");
  25. System.out.println("cloblengthis:"+b.getLength());
  26. Filef=newFile("d:\\1.jpg");//1.jpg一张QQ的截图
  27. System.out.println("filepathis:"+f.getAbsolutePath());
  28. BufferedInputStreamin=newBufferedInputStream(
  29. newFileInputStream(f));
  30. BufferedOutputStreamout=newBufferedOutputStream(b
  31. .getBinaryOutputStream());
  32. intc;
  33. while((c=in.read())!=-1)
  34. {
  35. out.write(c);
  36. }
  37. in.close();
  38. out.close();
  39. }
  40. con.commit();
  41. }
  42. catch(Exceptione)
  43. {
  44. con.rollback();//出错回滚
  45. e.printStackTrace();
  46. }
  47. }
  48. }

第四步,新建com.test.InsertClobData.java,用于插入clob数据类型的,代码如下:

Java代码
  1. classInsertClobData
  2. {
  3. privateResultSetrs=null;
  4. privateInitDBidb=null;
  5. InsertClobData()
  6. {
  7. idb=newInitDB();
  8. }
  9. publicvoidinsertClob(Stringsql1)throwsSQLException
  10. {
  11. Connectioncon=idb.getCon();
  12. try
  13. {
  14. con.setAutoCommit(false);//不设置自动提交
  15. BLOBblob=null;//插入空的Clob
  16. PreparedStatementpstmt=con
  17. .prepareStatement("insertintocdl_test(sid,doc)values(?,empty_clob())");
  18. pstmt.setString(1,"101");
  19. pstmt.executeUpdate();
  20. pstmt.close();
  21. rs=con.createStatement().executeQuery(sql1);
  22. while(rs.next())
  23. {
  24. System.out.println("sdfasdfas");
  25. oracle.sql.CLOBcb=(oracle.sql.CLOB)rs.getClob("doc");
  26. Filef=newFile("d:\\1.txt");//1.txt一本小说《风云》马荣成
  27. System.out.println("filepathis:"+f.getAbsolutePath());
  28. BufferedWriterout=newBufferedWriter(cb
  29. .getCharacterOutputStream());
  30. BufferedReaderin=newBufferedReader(newFileReader(f));
  31. intc;
  32. while((c=in.read())!=-1)
  33. {
  34. out.write(c);
  35. }
  36. in.close();
  37. out.close();
  38. }
  39. con.commit();
  40. }
  41. catch(Exceptione)
  42. {
  43. con.rollback();//出错回滚
  44. e.printStackTrace();
  45. }
  46. }
  47. }

第五步,新建com.test.ReadBlobData.java,用于读取blob类型的数据,代码如下:

Java代码
  1. classReadBlobData
  2. {
  3. privateResultSetrs=null;
  4. privateInitDBidb=null;
  5. ReadBlobData()
  6. {
  7. idb=newInitDB();
  8. }
  9. publicvoidgetBlob(Stringsql2)throwsSQLException
  10. {
  11. Connectioncon=idb.getCon();
  12. con.setAutoCommit(false);
  13. try
  14. {
  15. System.out.println("sq2is:"+sql2);
  16. System.out.println("stmtis:"+con);
  17. rs=con.createStatement().executeQuery(sql2);
  18. while(rs.next())
  19. {
  20. System.out.println("rslengthis:");
  21. Blobb=(Blob)rs.getBlob("img");
  22. Filef=newFile("D:\\1.jpg");
  23. FileOutputStreamfos=newFileOutputStream(f);
  24. InputStreamis=b.getBinaryStream();//读出数据后转换为二进制流
  25. byte[]data=newbyte[1024];
  26. while(is.read(data)!=-1)
  27. {
  28. fos.write(data);
  29. }
  30. fos.close();
  31. is.close();
  32. }
  33. con.commit();//正式提交
  34. }
  35. catch(Exceptione)
  36. {
  37. e.printStackTrace();
  38. }
  39. finally
  40. {
  41. //rs.close();
  42. }
  43. }
  44. }

第六步,新建com.test.ReadClobData.java,用于读取clob类型的数据,代码如下:

Java代码
  1. classReadClobData
  2. {
  3. privateResultSetrs=null;
  4. privateInitDBidb=null;
  5. ReadClobData()
  6. {
  7. idb=newInitDB();
  8. }
  9. publicvoidgetClob(Stringsql2)throwsSQLException
  10. {
  11. Connectioncon=idb.getCon();
  12. try
  13. {
  14. con.setAutoCommit(false);//不设置自动提交
  15. System.out.println("sq2is:"+sql2);
  16. rs=con.createStatement().executeQuery(sql2);
  17. while(rs.next())
  18. {
  19. oracle.sql.CLOBclob=(oracle.sql.CLOB)rs.getClob("doc");
  20. Filef=newFile("d:\\1.txt");
  21. BufferedReaderin=newBufferedReader(clob
  22. .getCharacterStream());
  23. //setCharacterStream()方法,可用于将CLOB字段与字节流相关联,
  24. BufferedWriterout=newBufferedWriter(newFileWriter(f));
  25. intc;
  26. while((c=in.read())!=-1)
  27. {
  28. out.write(c);
  29. }
  30. out.close();
  31. in.close();
  32. }
  33. con.commit();//正式提交
  34. rs.close();
  35. }
  36. catch(Exceptione)
  37. {
  38. e.printStackTrace();
  39. con.rollback();
  40. }
  41. }
  42. }

最后,就是新建测试类了,每每用着main方法,我就感觉这世界是多么的有爱啊,junit什么的,最讨厌了.....

Java代码
  1. publicclassTestBlob_Clob
  2. {
  3. publicstaticvoidmain(String[]args)
  4. {
  5. Stringsql1="select*fromcdl_testforupdate";//悲观锁锁定需更新的行
  6. Stringsql2="select*fromcdl_test";
  7. System.out.println("\t\t\t欢迎使用:");
  8. System.out.println("1:插入图片");
  9. System.out.println("2:插入文本");
  10. System.out.println("3:读取图片");
  11. System.out.println("4:读取文本");
  12. System.out.println("5:退出");
  13. System.out.println("请选择:");
  14. while(true)
  15. {
  16. try
  17. {
  18. Scannersc=newScanner(System.in);
  19. inti=sc.nextInt();
  20. System.out.println("sss:"+i);
  21. switch(i)
  22. {
  23. case1:
  24. InsertBlobDataisd=newInsertBlobData();
  25. //插入图片
  26. isd.insertBlob(sql1);
  27. break;
  28. case2:
  29. InsertClobDataicd=newInsertClobData();
  30. //插入小说
  31. icd.insertClob(sql1);
  32. break;
  33. case3:
  34. ReadBlobDatarb=newReadBlobData();
  35. //得到图片
  36. rb.getBlob(sql2);
  37. break;
  38. case4:
  39. ReadClobDatarc=newReadClobData();
  40. //得到小说
  41. rc.getClob(sql2);
  42. break;
  43. case5:
  44. System.exit(0);
  45. }
  46. }
  47. catch(Exceptione)
  48. {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库中的BLOBCLOB是用来存储大数据(二进制大对象和字符大对象)的数据类型BLOB可以存储二进制数据,如图片、音频和视频等,而CLOB则用于存储文本数据。 要导出BLOBCLOB数据,可以使用Oracle数据库提供的工具和方法。以下是一种常见的导出方法: 1. 使用 Oracle SQL Developer 进行导出: - 打开 Oracle SQL Developer 工具,并连接到要导出的数据库。 - 在“工具栏”上选择“导出数据”选项。 - 在导出向导中,选择要导出的表并指定目标文件夹。 - 在“导出格式”下,选择“BLOB”或“CLOB”。 - 点击“下一步”并根据导出设置完成导出过程。 要导入BLOBCLOB数据,也可以使用类似的方法: 1. 使用 Oracle SQL Developer 进行导入: - 打开 Oracle SQL Developer 工具,并连接到要导入的数据库。 - 在“工具栏”上选择“导入数据”选项。 - 在导入向导中,选择要导入的表和数据文件。 - 在“导入格式”下,选择“BLOB”或“CLOB”。 - 点击“下一步”并根据导入设置完成导入过程。 此外,还可以使用PL/SQL语言编写脚本来导出和导入BLOBCLOB数据。使用PL/SQL可以更灵活地进行数据处理和转换。可以编写一段脚本来查询BLOBCLOB数据,并将其导出到文件中,然后在另一个数据库上运行脚本来导入数据。 总之,Oracle数据库提供了多种方法来导出和导入BLOBCLOB数据。使用这些方法,可以方便地将大数据对象从一个数据库迁移到另一个数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值