注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

Java存取Clob对象(Hibernate实现Clob和Blob对象)  

2013-02-18 18:28:39|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

数据库中的一种保存文件所使用的类型。
Character Large Object
SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(CLOB) 实现 Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身。Clob 对象在它被创建的事务处理期间有效。
在一些数据库系统里,也使用Text 作为CLOB的别名,比如SQL Server

CLOB和BLOB的区别

CLOB使用CHAR来保存数据。   如:保存XML文档。
BLOB就是使用二进制保存数据。   如:保存位图。
1.刚开始接触Clob对象,简单的实现了对Clob对象的存取,Blob对象的存取跟它差不多,写入的时候有三部,第一先插入一个空的empty_clob(),然后获得这个cursor,然后再修改,这要牵涉到IO流的操作。。。 
贴一下我的代码,写得比较懒,见谅啊各位。。石头轻砸。。。 
Java代码 
  1. package com.mj.utils;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.io.Reader;  
  6. import java.sql.Connection;  
  7. import java.sql.DriverManager;  
  8. import java.sql.PreparedStatement;  
  9. import java.sql.ResultSet;  
  10. import java.sql.SQLException;  
  11.   
  12. import oracle.sql.CLOB;  
  13.   
  14. /** 
  15.  *  
  16.  * @author M.J 
  17.  * 
  18.  */  
  19. public class ClobTest {  
  20.       
  21.     private static Connection conn=null;  
  22.       
  23.     private static PreparedStatement ps=null;  
  24.       
  25.     private static ResultSet rst=null;  
  26.       
  27.     static{  
  28.         try {  
  29.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  30.             conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:WMG""hibernate","hibernate");  
  31.         } catch (ClassNotFoundException e) {  
  32.             e.printStackTrace();  
  33.         } catch (SQLException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.       
  38.     /** 
  39.      * 插入Clob数据 
  40.      * @param strClob 
  41.      * @return 
  42.      */  
  43.     public boolean inserClob(String userid, String strClob){  
  44.         boolean suc=false;  
  45.         //CLOB使用的是oracle.sql.CLOB貌似JDBC接口的java.sql.Clob支持读入,但不支持写入Clob对象,Blob也是。。。  
  46.         //这里需要注意的是,在给HH调试bug的时候,它出的错误是,无法把oracle.sql.CLOB对象转换成oracle.sql.CLOB,因为它连接数据库是用  
  47.         //了Tomcat配置的数据源,所以在tomcat的common/lib目录下面有一个classes12.jar或者是ojdbc.jar,它的项目里面因为要引用oracle.sql.jar  
  48.         //所以在项目lib目录下它也放了一个jar,这样造成了jar包之间的冲突,解决方法就是,将Web应用lib目录下的oracle驱动给移除掉(不是从构建路径上给  
  49.         //remove掉,而是删除,如果remove不起作用,试过。。。),然后外部引用common/lib目录下面的oracle驱动  
  50.         CLOB clob=null;  
  51.         //插入一个空的Clob对象,这是一个Cursor  
  52.         String sql="INSERT into test_clob(userid,clob_test) VALUES(?,empty_clob())";  
  53.         try {  
  54.             //禁用自动提交事务  
  55.             conn.setAutoCommit(false);  
  56.             ps=conn.prepareStatement(sql);  
  57.             ps.setString(1, userid);  
  58.             ps.executeUpdate();  
  59.             ps.close();  
  60.               
  61.             //查询并获得这个cursor,并且加锁  
  62.             sql="SELECT clob_test FROM test_clob WHERE userid=? for update";  
  63.             ps=conn.prepareStatement(sql);  
  64.             ps.setString(1, userid);  
  65.             rst=ps.executeQuery();  
  66.             if(rst.next()){  
  67.                 clob=(CLOB)rst.getClob(1);  
  68.             }  
  69.   
  70.               
  71.             //获得clob对象的输出流  
  72.             PrintWriter pw=new PrintWriter(clob.getCharacterOutputStream());  
  73.             pw.write(strClob);  
  74.             //一定要flush(),否则不会将String对象写入到Clob当中去。。。  
  75.             pw.flush();  
  76.             ps.close();  
  77.               
  78.             //更新clob对象  
  79.             sql="UPDATE test_clob set clob_test =? where userid=?";  
  80.             ps=conn.prepareStatement(sql);  
  81.             ps.setClob(1, clob);  
  82.             ps.setString(2, userid);  
  83.             ps.executeUpdate();  
  84.             ps.close();  
  85.             conn.commit();  
  86.             pw.close();  
  87.         } catch (SQLException e) {  
  88.             e.printStackTrace();  
  89.         }  
  90.           
  91.         return suc;  
  92.     }  
  93.     /** 
  94.      * 输出Clob对象 
  95.      * @param userid 
  96.      */  
  97.     public String readClob(String userid){  
  98.         String test_clob="";  
  99.         CLOB clob=null;  
  100.         StringBuffer sb=new StringBuffer();  
  101.         String sql="SELECT * FROM test_clob WHERE userid='"+userid+"'";  
  102.         try {  
  103.             ps=conn.prepareStatement(sql);  
  104.             rst=ps.executeQuery();  
  105.             if(rst.next()){  
  106.                 clob=(CLOB)rst.getClob(2);  
  107.             }  
  108.             Reader reader=clob.getCharacterStream();  
  109.             char[] buffer=new char[1024];  
  110.             int length=0;  
  111.             while((length=reader.read(buffer))!=-1){  
  112.                 sb.append(buffer, 0, length);  
  113.             }  
  114.         } catch (SQLException e) {  
  115.             e.printStackTrace();  
  116.         } catch (IOException e) {  
  117.             e.printStackTrace();  
  118.         }  
  119.         test_clob=sb.toString();  
  120.         return test_clob;  
  121.     }  
  122.     public static void main(String[] args){  
  123.         new ClobTest().inserClob("4","我是Clob,哈哈");  
  124.         String test=new ClobTest().readClob("4");  
  125.         System.out.println(test);  
  126.     }  
  127. }  


Hibernate实现Clob和Blob对象的读取


1.数据表:

Sql代码 
  1. create table T_PRODUCT  
  2. (  
  3.   PRODUCT_ID          VARCHAR2(50) not null,  
  4.   PRODUCT_NAME        VARCHAR2(50),  
  5.   PRODUCT_DESCRIPTION CLOB,  
  6.   PRODUCT_PHOTO       BLOB,  
  7.   PRODUCT_PRICE       NUMBER(10,2)  
  8. );  
  9. alter table T_PRODUCT  
  10.   add constraint PK_PRODUCT_ID primary key (PRODUCT_ID);  

 

2.实体类:

Java代码 
  1. package com.sun.demo.domain;  
  2.   
  3. import java.sql.Blob;  
  4. import java.sql.Clob;  
  5.   
  6. public class Product implements java.io.Serializable {  
  7.   
  8.     private String productId;  
  9.   
  10.     private String productName;  
  11.   
  12.     private Clob productDescription;  
  13.   
  14.     private Blob productPhoto;  
  15.   
  16.     private Double productPrice;  
  17.   
  18.     public Product() {  
  19.     }  
  20.   
  21.     public String getProductId() {  
  22.         return this.productId;  
  23.     }  
  24.   
  25.     public void setProductId(String productId) {  
  26.         this.productId = productId;  
  27.     }  
  28.   
  29.     public String getProductName() {  
  30.         return this.productName;  
  31.     }  
  32.   
  33.     public void setProductName(String productName) {  
  34.         this.productName = productName;  
  35.     }  
  36.   
  37.     public Clob getProductDescription() {  
  38.         return productDescription;  
  39.     }  
  40.   
  41.     public void setProductDescription(Clob productDescription) {  
  42.         this.productDescription = productDescription;  
  43.     }  
  44.   
  45.     public Blob getProductPhoto() {  
  46.         return productPhoto;  
  47.     }  
  48.   
  49.     public void setProductPhoto(Blob productPhoto) {  
  50.         this.productPhoto = productPhoto;  
  51.     }  
  52.   
  53.     public Double getProductPrice() {  
  54.         return this.productPrice;  
  55.     }  
  56.   
  57.     public void setProductPrice(Double productPrice) {  
  58.         this.productPrice = productPrice;  
  59.     }  
  60.   
  61. }  

 

 

3.操作类:

Java代码 
  1. import java.io.BufferedOutputStream;  
  2. import java.io.FileOutputStream;  
  3. import java.io.InputStream;  
  4. import java.io.Reader;  
  5. import java.sql.Blob;  
  6. import java.sql.Clob;  
  7.   
  8. import org.hibernate.Session;  
  9.   
  10. import com.sun.demo.domain.Product;  
  11. import com.sun.demo.service.HibernateSessionFactory;  
  12.   
  13. public class ReadBlobClob {  
  14.   
  15.     public static void read() {  
  16.         Session session = HibernateSessionFactory.getSession();  
  17.         Product product = (Product) session.get(Product.class"10000");  
  18.   
  19.         if (product != null) {  
  20.             try {  
  21.                 Blob photo = product.getProductPhoto();  
  22.                 Clob desc = product.getProductDescription();  
  23.   
  24.                 // 打印Clob内容  
  25.                 Reader reader = desc.getCharacterStream();  
  26.                 int c = -1;  
  27.                 while ((c = reader.read()) != -1) {  
  28.                     System.out.print((char) c);  
  29.                 }  
  30.                 // 将数据库中的Blob对象转存为文件  
  31.                 InputStream is = photo.getBinaryStream();  
  32.                 BufferedOutputStream bos = new BufferedOutputStream(  
  33.                         new FileOutputStream("d:/bak.gif"));  
  34.                 while ((c = is.read()) != -1) {  
  35.                     bos.write(c);  
  36.                 }  
  37.                 reader.close();  
  38.                 bos.close();  
  39.                 is.close();  
  40.             } catch (Exception e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.         session.close();  
  45.     }  
  46.     public static void main(String[] args) {  
  47.         read();  
  48.     }  
  49. }  

  评论这张
 
阅读(1231)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016