操作clob或blob的方法 JDBC 或hibernaet

2 篇文章 0 订阅

首先是建一张名为LOBTEST的测试表 字段 ID(NUMBER)、UNAME(VARCHAR2)、JIANJIE(CLOB)、TOUXIANG(BLOB)

 

1、JDBC的操作方法

(1)往数据库存储CLOB和BLOB型字段数据。数据来源文本文件和图片文件,演示代码如下:

[java]  view plain copy
  1. import java.io.*;    
  2. import java.sql.Connection;    
  3. import java.sql.DriverManager;    
  4. import java.sql.PreparedStatement;    
  5. import java.sql.ResultSet;    
  6. import java.sql.SQLException;    
  7.     
  8.     
  9. public class InsertLob {    
  10.     
  11.     /**  
  12.      * @param args  
  13.      * @throws IOException   
  14.      */    
  15.     public static void main(String[] args) throws IOException {    
  16.         try {    
  17.             long startTime=System.currentTimeMillis();    
  18.             Class.forName("oracle.jdbc.driver.OracleDriver");    
  19.             String url="jdbc:oracle:thin:@192.168.130.131:1521:ICSS";    
  20.             String user="lixiang";    
  21.             String password="19870924";    
  22.             Connection conn=DriverManager.getConnection(url,user,password);    
  23.             conn.setAutoCommit(false);//这句很重要    
  24.                 
  25.             //1、插入一条LOB字段都是空值的记录    
  26.             String inSql="insert into LIXIANG.LOBTEST(ID,UNAME,JIANJIE,TOUXIANG)values(?,?,?,?)";    
  27.             PreparedStatement preStm=conn.prepareStatement(inSql);    
  28.             preStm.setInt(11);    
  29.             preStm.setString(2"奶茶妹妹");    
  30.             preStm.setClob(3, oracle.sql.CLOB.getEmptyCLOB());//引入oracle的ojdbc6.jar驱动包后可用    
  31.             preStm.setBlob(4, oracle.sql.BLOB.getEmptyBLOB());//先往表里LOB字段插入空值,关于这样的做法许多别的文章有讲解原因。    
  32.             preStm.executeUpdate();    
  33.             preStm.close();    
  34.                 
  35.             //2、将该条记录再取出,然后对LOB字段传入你要保存的数据    
  36.             String outSql="select JIANJIE,TOUXIANG from LIXIANG.LOBTEST where ID=? for update";    
  37.             preStm=conn.prepareStatement(outSql);    
  38.             preStm.setInt(11);    
  39.             ResultSet rst=preStm.executeQuery();    
  40.             rst.next();    
  41.             oracle.sql.CLOB clob=(oracle.sql.CLOB)rst.getClob(1);    
  42.             oracle.sql.BLOB blob=(oracle.sql.BLOB)rst.getBlob(2);    
  43.             BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\naicha.jpeg"));//D盘根目录下有个名为naicha.jpeg的图片    
  44.             BufferedOutputStream bos=new BufferedOutputStream(blob.setBinaryStream(0));    
  45.             byte[] buf=new byte[10240];//10K字节的缓存 以字节流的方式传输    
  46.             int len;    
  47.             while((len=bis.read(buf))!=-1){    
  48.                 bos.write(buf);    
  49.             }//关于JAVA输入输出流的东西 http://muzixiang.iteye.com/blog/912451    
  50.             bis.close();    
  51.             bos.close();    
  52.             BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));//D盘根目录下有个名为test.txt的文本文件    
  53.             BufferedWriter bw=new BufferedWriter(clob.setCharacterStream(0));    
  54.             char[] cbuf=new char[1024];//1K的字符缓存 以字符流的方式传输    
  55.             while((len=br.read(cbuf))!=-1){    
  56.                 bw.write(cbuf);    
  57.             }//关于JAVA输入输出流的东西 http://muzixiang.iteye.com/blog/912451    
  58.             br.close();    
  59.             bw.close();    
  60.             rst.close();    
  61.             preStm.close();    
  62.                 
  63.             //3、将Blob Clob字段更新到数据库 这步必不可少!    
  64.             String upSql="update LIXIANG.LOBTEST set JIANJIE=?,TOUXIANG=? where ID=?";    
  65.             preStm=conn.prepareStatement(upSql);    
  66.             preStm.setClob(1, clob);    
  67.             preStm.setBlob(2, blob);    
  68.             preStm.setInt(31);    
  69.             preStm.executeUpdate();    
  70.             preStm.close();    
  71.             conn.commit();//前面设置conn.setAutoCommit(false)所以这里勿忘手动提交!    
  72.             conn.close();    
  73.                 
  74.             long endTime=System.currentTimeMillis();    
  75.             long totalTime=endTime-startTime;    
  76.             System.out.println("程序总共运行了"+totalTime+"毫秒");    
  77.         } catch (ClassNotFoundException e) {    
  78.             // TODO Auto-generated catch block    
  79.             e.printStackTrace();    
  80.         } catch (SQLException e) {    
  81.             // TODO Auto-generated catch block    
  82.             e.printStackTrace();    
  83.         }    
  84.     }    
  85.     
  86. }    

D:\test.txt的内容如下 保存到数据库后打开表我们发现CLOB字段保存文本中的格式,也是按照两行来存储的!

(2)从数据库中读出CLOB和BLOB型数据。将数据读取到文本文件和图片文件,演示代码如下:

[java]  view plain copy
  1. import java.io.BufferedInputStream;    
  2. import java.io.BufferedOutputStream;    
  3. import java.io.BufferedReader;    
  4. import java.io.BufferedWriter;    
  5. import java.io.File;    
  6. import java.io.FileOutputStream;    
  7. import java.io.FileWriter;    
  8. import java.io.IOException;    
  9. import java.sql.Connection;    
  10. import java.sql.DriverManager;    
  11. import java.sql.PreparedStatement;    
  12. import java.sql.ResultSet;    
  13. import java.sql.SQLException;    
  14.     
  15.     
  16. public class getLob {    
  17.     
  18.     /**  
  19.      * @param args  
  20.      * @throws IOException   
  21.      */    
  22.     public static void main(String[] args) throws IOException {    
  23.         try {    
  24.             long startTime=System.currentTimeMillis();    
  25.                 
  26.             Class.forName("oracle.jdbc.driver.OracleDriver");    
  27.             String url="jdbc:oracle:thin:@192.168.130.131:1521:ICSS";    
  28.             String user="lixiang";    
  29.             String password="19870924";    
  30.             Connection conn=DriverManager.getConnection(url,user,password);    
  31.                 
  32.             conn.setAutoCommit(false);//这句很重要    
  33.             String sql="select JIANJIE,TOUXIANG from LIXIANG.LOBTEST where id=?";    
  34.             PreparedStatement preStm=conn.prepareStatement(sql);    
  35.             preStm.setInt(11);    
  36.             ResultSet rst=preStm.executeQuery();    
  37.             rst.next();    
  38.             oracle.sql.CLOB clob=(oracle.sql.CLOB)rst.getClob("JIANJIE");//有的程序里用的是java.sql.Clob类和java.sql.Blob类不需要强制转换也实现目的了。。    
  39.             oracle.sql.BLOB blob=(oracle.sql.BLOB)rst.getBlob("TOUXIANG");    
  40.                 
  41.             BufferedReader br=new BufferedReader(clob.getCharacterStream());    
  42.             BufferedWriter bw=new BufferedWriter(new FileWriter(new File("D:\\Clob.txt")));    
  43.             BufferedInputStream bis=new BufferedInputStream(blob.getBinaryStream());    
  44.             BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("D:\\Blob.jpeg")));    
  45.                 
  46.             char[] cbuf=new char[1024];    
  47.             int len;    
  48.             while((len=br.read(cbuf))!=-1){    
  49.                 bw.write(cbuf);    
  50.                 bw.flush();//这句非常重要,一开始就是因为没有加这句导致没有成功将数据库内容输出到文本文件里    
  51.             }    
  52.                 
  53.             byte[] buff=new byte[10240];    
  54.             while((len=bis.read(buff))!=-1){    
  55.                 bos.write(buff);    
  56.                 bos.flush();    
  57.             }    
  58.                 
  59.             rst.close();    
  60.             preStm.close();    
  61.             conn.commit();    
  62.             conn.close();    
  63.                 
  64.             long endTime=System.currentTimeMillis();    
  65.             long totalTime=endTime-startTime;    
  66.             System.out.println("程序总共运行了"+totalTime+"毫秒");           
  67.                 
  68.         } catch (ClassNotFoundException e) {    
  69.             // TODO Auto-generated catch block    
  70.             e.printStackTrace();    
  71.         } catch (SQLException e) {    
  72.             // TODO Auto-generated catch block    
  73.             e.printStackTrace();    
  74.         }    
  75.     }    
  76. }    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值