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

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

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

 

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

 

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

Java代码 
  1. class InitDB{  
  2.     private static Connection con = null;  
  3.     private static Statement stmt = null;  
  4.     private static ResultSet rs = null;  
  5.   
  6.     //链接oracle数据库  
  7.     InitDB()  
  8.     {  
  9.         try  
  10.         {  
  11.             Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
  12.             String url = "jdbc:oracle:thin:@localhost :1521:YYSMID";   
  13.             String user = "zhangsan";  
  14.             String password = "Lc123456";  
  15.             con = (Connection) DriverManager.getConnection(url, user, password);  
  16.             InitDB.setCon(con);  
  17.         }  
  18.         catch (Exception e)  
  19.         {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23.   
  24.     public void closCon()  
  25.     {  
  26.         try  
  27.         {  
  28.             con.close();  
  29.         }  
  30.         catch (Exception e)  
  31.         {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35.   
  36.     public void stmt()  
  37.     {  
  38.         try  
  39.         {  
  40.             con.close();  
  41.         }  
  42.         catch (Exception e)  
  43.         {  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  
  47.   
  48.     public void rs()  
  49.     {  
  50.         try  
  51.         {  
  52.             con.close();  
  53.         }  
  54.         catch (Exception e)  
  55.         {  
  56.             e.printStackTrace();  
  57.         }  
  58.     }  
  59.   
  60.     public static Connection getCon()  
  61.     {  
  62.         return con;  
  63.     }  
  64.   
  65.     public static void setCon(Connection con)  
  66.     {  
  67.         InitDB.con = con;  
  68.     }  
  69.   
  70.     public static ResultSet getRs()  
  71.     {  
  72.         return rs;  
  73.     }  
  74.   
  75.     public static void setRs(ResultSet rs)  
  76.     {  
  77.         InitDB.rs = rs;  
  78.     }  
  79.   
  80.     public static Statement getStmt()  
  81.     {  
  82.         return stmt;  
  83.     }  
  84.   
  85.     public static void setStmt(Statement stmt)  
  86.     {  
  87.         InitDB.stmt = stmt;  
  88.     }  
  89. }  
 

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

Java代码 
  1.   
Java代码 
  1. class InsertBlobData{  
  2.     private ResultSet rs = null;  
  3.     private InitDB idb = null;  
  4.   
  5.     InsertBlobData()  
  6.     {  
  7.         idb = new InitDB();  
  8.     }  
  9.   
  10.     public void insertBlob(String sql1) throws SQLException  
  11.     {  
  12.         Connection con = idb.getCon();  
  13.         try  
  14.         {  
  15.             con.setAutoCommit(false);// 不设置自动提交  
  16.             BLOB blob = null// 插入空的Blob  
  17.             PreparedStatement pstmt = con  
  18.                     .prepareStatement("insert into cdl_test(sid,img) values(?,empty_blob())");  
  19.             pstmt.setString(1"100");  
  20.             pstmt.executeUpdate();  
  21.             pstmt.close();  
  22.             rs = con.createStatement().executeQuery(sql1);  
  23.             while (rs.next())  
  24.             {  
  25.                 System.out.println("rs length is:");  
  26.                 oracle.sql.BLOB b = (oracle.sql.BLOB) rs.getBlob("img");  
  27.                 System.out.println("cloblength is:" + b.getLength());  
  28.                 File f = new File("d:\\1.jpg"); //1.jpg一张QQ的截图  
  29.                 System.out.println("file path is:" + f.getAbsolutePath());  
  30.                 BufferedInputStream in = new BufferedInputStream(  
  31.                         new FileInputStream(f));  
  32.                 BufferedOutputStream out = new BufferedOutputStream(b  
  33.                         .getBinaryOutputStream());  
  34.                 int c;  
  35.                 while ((c = in.read()) != -1)  
  36.                 {  
  37.                     out.write(c);  
  38.                 }  
  39.                 in.close();  
  40.                 out.close();  
  41.             }  
  42.             con.commit();  
  43.         }  
  44.         catch (Exception e)  
  45.         {  
  46.             con.rollback();// 出错回滚  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50. }  

 

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

 

 

Java代码 
  1. class InsertClobData  
  2. {  
  3.     private ResultSet rs = null;  
  4.     private InitDB idb = null;  
  5.   
  6.     InsertClobData()  
  7.     {  
  8.         idb = new InitDB();  
  9.     }  
  10.   
  11.     public void insertClob(String sql1) throws SQLException  
  12.     {  
  13.         Connection con = idb.getCon();  
  14.         try  
  15.         {  
  16.             con.setAutoCommit(false);// 不设置自动提交  
  17.             BLOB blob = null// 插入空的Clob  
  18.             PreparedStatement pstmt = con  
  19.                     .prepareStatement("insert into cdl_test(sid,doc) values(?,empty_clob())");  
  20.             pstmt.setString(1"101");  
  21.             pstmt.executeUpdate();  
  22.             pstmt.close();  
  23.             rs = con.createStatement().executeQuery(sql1);  
  24.             while (rs.next())  
  25.             {  
  26.                 System.out.println("sdfasdfas");  
  27.                 oracle.sql.CLOB cb = (oracle.sql.CLOB) rs.getClob("doc");  
  28.                 File f = new File("d:\\1.txt"); //1.txt一本小说《风云》马荣成  
  29.                 System.out.println("file path is:" + f.getAbsolutePath());  
  30.                 BufferedWriter out = new BufferedWriter(cb  
  31.                         .getCharacterOutputStream());  
  32.                 BufferedReader in = new BufferedReader(new FileReader(f));  
  33.                 int c;  
  34.                 while ((c = in.read()) != -1)  
  35.                 {  
  36.                     out.write(c);  
  37.                 }  
  38.                 in.close();  
  39.                 out.close();  
  40.             }  
  41.             con.commit();  
  42.         }  
  43.         catch (Exception e)  
  44.         {  
  45.             con.rollback();// 出错回滚  
  46.             e.printStackTrace();  
  47.         }  
  48.     }  
  49. }  
 

 

 

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

 

 

Java代码 
  1. class ReadBlobData  
  2. {  
  3.     private ResultSet rs = null;  
  4.     private InitDB idb = null;  
  5.   
  6.     ReadBlobData()  
  7.     {  
  8.         idb = new InitDB();  
  9.     }  
  10.   
  11.     public void getBlob(String sql2) throws SQLException  
  12.     {  
  13.         Connection con = idb.getCon();  
  14.         con.setAutoCommit(false);  
  15.         try  
  16.         {  
  17.             System.out.println("sq2 is:" + sql2);  
  18.             System.out.println("stmt is:" + con);  
  19.             rs = con.createStatement().executeQuery(sql2);  
  20.             while (rs.next())  
  21.             {  
  22.                 System.out.println("rs length is:");  
  23.                 Blob b = (Blob) rs.getBlob("img");  
  24.                 File f = new File("D:\\1.jpg");  
  25.                 FileOutputStream fos = new FileOutputStream(f);  
  26.                 InputStream is = b.getBinaryStream();// 读出数据后转换为二进制流  
  27.                 byte[] data = new byte[1024];  
  28.                 while (is.read(data) != -1)  
  29.                 {  
  30.                     fos.write(data);  
  31.                 }  
  32.                 fos.close();  
  33.                 is.close();  
  34.             }  
  35.             con.commit();// 正式提交  
  36.         }  
  37.         catch (Exception e)  
  38.         {  
  39.             e.printStackTrace();  
  40.         }  
  41.         finally  
  42.         {  
  43.             // rs.close();  
  44.         }  
  45.     }  
  46. }  

 

 

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

 

 

Java代码 
  1. class ReadClobData  
  2. {  
  3.     private ResultSet rs = null;  
  4.     private InitDB idb = null;  
  5.   
  6.     ReadClobData()  
  7.     {  
  8.         idb = new InitDB();  
  9.     }  
  10.   
  11.     public void getClob(String sql2) throws SQLException  
  12.     {  
  13.         Connection con = idb.getCon();  
  14.         try  
  15.         {  
  16.             con.setAutoCommit(false);// 不设置自动提交  
  17.             System.out.println("sq2 is:" + sql2);  
  18.             rs = con.createStatement().executeQuery(sql2);  
  19.             while (rs.next())  
  20.             {  
  21.                 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("doc");  
  22.                 File f = new File("d:\\1.txt");  
  23.                 BufferedReader in = new BufferedReader(clob  
  24.                         .getCharacterStream());  
  25.                 // setCharacterStream()方法,可用于将CLOB字段与字节流相关联,  
  26.                 BufferedWriter out = new BufferedWriter(new FileWriter(f));  
  27.                 int c;  
  28.                 while ((c = in.read()) != -1)  
  29.                 {  
  30.                     out.write(c);  
  31.                 }  
  32.                 out.close();  
  33.                 in.close();  
  34.             }  
  35.             con.commit();// 正式提交  
  36.             rs.close();  
  37.         }  
  38.         catch (Exception e)  
  39.         {  
  40.             e.printStackTrace();  
  41.             con.rollback();  
  42.         }  
  43.     }  
  44. }  

 

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

 

 

Java代码 
  1. public class TestBlob_Clob  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         String sql1 = "select * from cdl_test  for update";// 悲观锁锁定需更新的行  
  6.         String sql2 = "select * from cdl_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.                 Scanner sc = new Scanner(System.in);  
  19.                 int i = sc.nextInt();  
  20.                 System.out.println("sss:" + i);  
  21.                 switch (i)  
  22.                 {  
  23.                 case 1:  
  24.                     InsertBlobData isd = new InsertBlobData();  
  25.                     //插入图片  
  26.                     isd.insertBlob(sql1);  
  27.                     break;  
  28.                 case 2:  
  29.                     InsertClobData icd = new InsertClobData();  
  30.                     //插入小说  
  31.                     icd.insertClob(sql1);  
  32.                     break;  
  33.                 case 3:  
  34.                     ReadBlobData rb = new ReadBlobData();  
  35.                     //得到图片  
  36.                     rb.getBlob(sql2);  
  37.                     break;  
  38.                 case 4:  
  39.                     ReadClobData rc = new ReadClobData();  
  40.                     //得到小说  
  41.                     rc.getClob(sql2);  
  42.                     break;  
  43.                 case 5:  
  44.                     System.exit(0);  
  45.                 }  
  46.             }  
  47.             catch (Exception e)  
  48.             {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         }  
  52.     }  
  53. }  

你可能感兴趣的:(java,oracle,sql,数据库,JUnit,存储)