`

在Oracle中用HibernateJDBC对图片数据的操作(更新)

阅读更多

关于如何使用JDBC来操控oracle的blob数据类型:
首先给出数据库表的结果描述:
ID VARCHAR2(64)--表关键字
IMGS BLOB --图片数据
IMGS_SIZE NUMBER(10) --图片大小
IMGS_TYPE VARCHAR2(30)--图片类型
NOTES CLOB --图片的解释
………… --这里还有其他一些字段,就不再列举出来
需求:
如果用户没有提交上传的图片数据信息,则不对IMGS字段进行修改,否则修改此信息,(这也就决定了这里的操作如果使用hibernate
的话需要用hibernate和JDBC混合编程实现)

POJO数据对象:

代码
  1. @Entity  
  2. @Table(name="image_datas")  
  3. public class ImageNotesData implements Serializable{  
  4.     private String id;  
  5.     private long imageSize;  
  6.     private String imageType;  
  7.     private String notes;  
  8.     private Blob imageData;  
  9.     @Id  
  10.     @Column(updatable = true,nullable=false,name="ID")  
  11.     public String getId(){  
  12.        return this.id;  
  13.     }  
  14.     @Column(updatable = true,nullable=true,name="NOTES")  
  15.     @Type(type="")  
  16.     public String getNotes(){  
  17.        return this.notes;  
  18.     }  
  19.     @Transient  
  20.     public String getImageType(){  
  21.        return this.imageType;  
  22.     }  
  23.     @Transient  
  24.     public long getImageSize(){  
  25.        return this.imageSize;  
  26.     }  
  27.     @Transient  
  28.     public Blob getImageData(){  
  29.        return this.imageData;  
  30.     }  
  31. }  
<script type="text/javascript">render_code();</script>

处理流程分为两步进行:
1、存储对图片数据信息的说明和其他一些非图片区数据信息;2、存储图片数据信息;
对于流程1,使用hibernate实现:

代码
  1. public void saveOrUpdateImageNodesData(ImageNodesData data){  
  2.     if(data.getId==null){  
  3.         hibUtil.save(data);//这个操作一般只会执行一次  
  4.     } else {  
  5.         hibUtil.update(data);//这个操作会因为数据信息的修改而频繁的执行  
  6.     }  
  7. }  
<script type="text/javascript">render_code();</script>
对于流程2,使用JDBC实现:
代码
  1.   public void updateImageData(String id,long size,String type,InputStream in){  
  2.     Session session = getSession();  
  3.     Connection conn = session.connection();  
  4.     session.flush();//需要注意的是这里需要调用flush来使得流程一种写入的数据在这里可以被读到  
  5.     PreparedStatement pstmt = null;  
  6.     BLOB blob = null;  
  7.     try {  
  8.         pstmt = conn.prepareStatement("update image_datas s set s.imgs =empty_blob() where s.id =?");  
  9.         pstmt.setString(1,id);  
  10.         pstmt.executeUpdate();  
  11.         pstmt = conn.prepareStatement("select s.imgs img from image_datas s where s.id= ? for update");   
  12.         pstmt.setString(1,id);   
  13.         ResultSet rs = pstmt.executeQuery();   
  14.         rs.next();  
  15.         blob = (BLOB) rs.getBlob("img");              
  16.         if(blob==null){  
  17.               
  18.         }  
  19.         int zize = in.available();  
  20.         pstmt = conn.prepareStatement("update image_datas s set s.imgs=?,s.imgs_size=?,s.imgs_type=? where id=?");   
  21.         OutputStream out = blob.getBinaryOutputStream();   
  22.         byte[] data = new byte[(int)in.available()];   
  23.         in.read(data);   
  24.         out.write(data);   
  25.         out.close();  
  26.         pstmt.setBlob(1,blob);  
  27.         pstmt.setLong(2,zize);  
  28.         pstmt.setString(3,type);  
  29.         pstmt.setString(4,id);  
  30.         pstmt.executeUpdate();  
  31.     } catch (SQLException e) {  
  32.            throw new DAOException(e);  
  33.     } catch(IOException e){  
  34.         throw new DAOException(e);  
  35.     }finally{  
  36.         JdbcHelper.close(pstmt,null);  
  37.     }  
  38. }  
<script type="text/javascript">render_code();</script>

需要注意的是因为写入“一般类型”的数据发生在写入图片数据之前,同时他们作为一个事务而存在为此在更新图片数据的时候(流程2)需要显式的调用session.flush(),否则我们不可能select 到任何在流程一中写入的数据信息

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    Java面试宝典2010版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 28、这段代码有什么...

    最新Java面试宝典pdf版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试笔试资料大全

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    JAVA面试宝典2010

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试宝典-经典

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    java面试题大全(2012版)

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试宝典2012版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、...

    java面试宝典2012

    24. 写一个用jdbc连接并访问oracle数据的程序代码 121 25、Class.forName的作用?为什么要用? 121 26、大数据量下的分页解决方法。 121 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 122 28、这段...

    Java面试宝典2012新版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java 面试宝典

    13、是否可以从一个 static 方法内部发出对非 static 方法的调用? ........................ 13 14、Integer 与 int 的区别 .....................................................................................

Global site tag (gtag.js) - Google Analytics