`

使用JDBC和Hibernate来写入Blob型数据到Oracle中(1)

 
阅读更多


Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。

写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。

看下面的JDBC的demo,把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段)

代码



1.import java.sql.*;   
2.import java.io.*;   
3.import oracle.sql.*;   
4.public class WriteBlob {   
5.  
6.  public static void main(String[] args) {   
7.  
8.    try {   
9.      DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());   
10.      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");   
11.      conn.setAutoCommit(false);   
12.  
13.      BLOB blob = null;   
14.  
15.      PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");   
16.      pstmt.setString(1,"fankai");   
17.      pstmt.executeUpdate();   
18.      pstmt.close();   
19.  
20.      pstmt = conn.prepareStatement("select content from javatest where name= ? for update");   
21.      pstmt.setString(1,"fankai");   
22.      ResultSet rset = pstmt.executeQuery();   
23.      if (rset.next()) blob = (BLOB) rset.getBlob(1);   
24.  
25.      String fileName = "oraclejdbc.jar";   
26.      File f = new File(fileName);   
27.      FileInputStream fin = new FileInputStream(f);   
28.      System.out.println("file size = " + fin.available());   
29.  
30.      pstmt = conn.prepareStatement("update javatest set content=? where name=?");   
31.  
32.      OutputStream out = blob.getBinaryOutputStream();   
33.  
34.      int count = -1, total = 0;   
35.      byte[] data = new byte[(int)fin.available()];   
36.      fin.read(data);   
37.      out.write(data);   
38.      /*  
39.      byte[] data = new byte[blob.getBufferSize()];  另一种实现方法,节省内存  
40.      while ((count = fin.read(data)) != -1) {  
41.        total += count;  
42.        out.write(data, 0, count);  
43.      }  
44.      */  
45.  
46.      fin.close();   
47.      out.close();   
48.  
49.      pstmt.setBlob(1,blob);   
50.      pstmt.setString(2,"fankai");   
51.  
52.      pstmt.executeUpdate();   
53.      pstmt.close();   
54.  
55.      conn.commit();   
56.      conn.close();   
57.    } catch (SQLException e) {   
58.      System.err.println(e.getMessage());   
59.      e.printStackTrace();   
60.    } catch (IOException e) {   
61.      System.err.println(e.getMessage());   
62.    }   
63.  }   
64.  
65.} 


仔细看上例,分三步:

1、插入空blob

into javatest(name,content) values(?,empty_blob());

2、获得blob的cursor

select content from javatest where for update;

注意!!!必须加for update,这将锁定该行,直至该行被修改完毕,保证不产生并发冲突。

3、update javatest set content=? where >

用cursor往数据库写数据

这里面还有一点要提醒大家:

JDK1.3带的JDBC2.0规范是不完善的,只有读Blob的接口,而没有写Blob的接口,JDK1.4带的JDBC3.0加入了写Blob的接口。你可以使用JDBC3.0的接口,也可以直接使用Oracle的JDBC的API,我在上例中使用了Oracle的JDBC的API。

另外要注意的是:

java.sql.Blob

oracle.sql.BLOB

注意看blob的大小写,是不一样的。写程序的时候不要搞混了。

下面看看用Hibernate怎么写,原理是一样的,也要分三步,但是代码简单很多

这是Cat对象定义

代码



1.package com.fankai;   
2.  
3.import java.sql.Blob;   
4.  
5.public class Cat {   
6.  private String id;   
7.  private String name;   
8.  private char sex;   
9.  private float weight;   
10.  private Blob image;   
11.  public Cat() { }   
12.  
13.  public String getId() { return id; }   
14.  public void setId(String id) { this.id = id; }   
15.  
16.  public String getName() { return name; }   
17.  public void setName(String name) { this.name = name; }   
18.  
19.  public char getSex() { return sex; }   
20.  public void setSex(char sex) { this.sex = sex; }   
21.  
22.  public float getWeight() { return weight; }   
23.  public void setWeight(float weight) { this.weight = weight; }   
24.     
25.  public Blob getImage() { return image; }   
26.  public void setImage(Blob image) { this.image = image;}   
27.} 


这是Cat.hbm.xml

代码



1.<?xml version="1.0"?>  
2.<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  
3.  
4.<hibernate-mapping>  
5.    <class name="com.fankai.Cat" table="cat">  
6.        <!--jcs-cache usage="read-only"/-->  
7.        <id name="id" unsaved-value="null">  
8.            <generator class="uuid.hex"/>  
9.        </id>  
10.        <property name="name" length="16" not-null="true"/>  
11.        <property name="sex" length="1" not-null="true"/>  
12.        <property name="weight" />  
13.        <property name="image" />  
14.    </class>  
15.</hibernate-mapping> 


下面是完整的用Hibernate写入Blob的例子,相比JDBC,已经简单轻松多了,也不用写那些Oracle特殊的sql了:

代码



1.package com.fankai;   
2.  
3.import java.sql.Blob;   
4.import net.sf.hibernate.*;   
5.import oracle.sql.*;   
6.import java.io.*;   
7.  
8.public class TestCatHibernate {     
9.  public static void testBlob() {   
10.    Session s = null;       
11.    byte[] buffer = new byte[1];   
12.    buffer[0] = 1;   
13.    try {   
14.      SessionFactory sf = HibernateSessionFactory.getSessionFactory();   
15.      s = sf.openSession();     
16.      Transaction tx = s.beginTransaction();   
17.      Cat c = new Cat();   
18.      c.setName("Robbin");   
19.      c.setImage(Hibernate.createBlob(buffer));   
20.      s.save(c);   
21.      s.flush();   
22.      s.refresh(c, LockMode.UPGRADE);       
23.      BLOB blob = (BLOB) c.getImage();         
24.      OutputStream out = blob.getBinaryOutputStream();      
25.      String fileName = "oraclejdbc.jar";   
26.      File f = new File(fileName);   
27.      FileInputStream fin = new FileInputStream(f);      
28.      int count = -1, total = 0;   
29.      byte[] data = new byte[(int)fin.available()];   
30.      fin.read(data);   
31.      out.write(data);         
32.      fin.close();   
33.      out.close();   
34.      s.flush();   
35.      tx.commit();   
36.      
37.    } catch (Exception e) {   
38.      System.out.println(e.getMessage());   
39.    } finally {   
40.      if (s != null)   
41.        try {   
42.          s.close();   
43.        } catch (Exception e) {}   
44.    }       
45.       
46.  }   
47.}
分享到:
评论

相关推荐

    基于pytorch+ResNet50的眼部疾病图片分类源码+文档说明.zip

    详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;详情请查看资源内容中使用说明;

    基于yolov5的鸟窝目标检测源码+模型.zip

    YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

    中南财经政法大学-答辩PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    node-v8.7.0-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030全球与中国混合光纤同轴网络市场现状及未来发展趋势.docx

    2024-2030全球与中国混合光纤同轴网络市场现状及未来发展趋势

    中南民族大学-答辩通用PPT模板我给母校送模板作品.pptx

    PPT模板,答辩PPT模板,毕业答辩,学术汇报,母校模板,我给母校送模板作品,周会汇报,开题答辩,教育主题模板下载。PPT素材下载。

    使用Spring Boot开发框架和Spark MLlib机器学习框架,通过FP-Growth算法,分析用户的购物车商品数据

    商品关联关系挖掘,使用Spring Boot开发框架和Spark MLlib机器学习框架,通过FP-Growth算法,分析用户的购物车商品数据,挖掘商品之间的关联关系。项目对外提供RESTFul接口。.zip

    OpenCv 使用fffffffff

    OpenCv 使用fffffffff

    node-v10.14.0-linux-ppc64le.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    课设&大作业-高校社团管理系统

    【资源说明】【毕业设计】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。 3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!

    基于java的学校教务管理系统 (jsp+servlet+sqlserver)(含程序运行详细说明文档).zip

    基于java的学校教务管理系统 (jsp+servlet+sqlserver)(含程序运行详细说明文档).zip

    iOS APP提审checklist

    根据App Store的审核条款总结出的checklist

    基于YOLOV5的移动物体检测分类系统源码.zip

    YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

    088ssm-vue教学视频点播系统.zip(可运行源码+数据库文件+文档)

    对于本视频点播系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据视频点播系统的现状来进行开发的,具体根据现实的需求来实现视频点播系统网络化的管理,各类信息有序地进行存储,进入视频点播系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、学生管理、教师管理、视频分类管理、视频信息管理、系统管理,学生前台:首页、视频信息、系统公告、个人中心、后台管理,教师:首页、个人中心、视频信息管理等功能。 本文主要讲述了视频点播系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的视频点播系统状况,提高管理效率。 关键词:视频点播系统;SSM框架,mysql数据库,B/S模式

    ky10升级内核版本包

    ky10升级内核版本包

    C语言课程设计计费管理系统源码.zip

    高分设计源码,详情请查看资源内容中使用说明 高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明高分设计源码,详情请查看资源内容中使用说明

    基于单片机的含计数功能的智能电子天平的研发

    针对小质量器件的称重和计数包装特点,本文设计了 个基千单片机的可以实现 高精度称重和智能计数的智能仪表。仪表主要由电源、 称重传感器、 单片机、 键盘/开关、LCD显示器等部分构成。仪表输入采用电阻应变式称重传感器, 模数转换利用 具有24位精度的AID转换器把传感器的模拟信号转换为数字信号送给单片机处理。通过软件的设计可以完成高精度的称重和针对小质量器件的准确计数。仪表还设计了按键、液晶显示器及翁鸣器等输入输出器件实现了良好的人机交互功能, 能够完成对 称重和计数的标定以及相关参数的设置。另外仪表还预留了通讯接口, 为以后的升级 以及联网数据传送奠定了基础。

    基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip

    基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip个人经导师指导并认可通过的98分课程设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip个人经导师指导并认可通过的98分课程设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip个人经导师指导并认可通过的98分课程设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip个人经导师指导并认可通过的98分课程设计项目,主要针对计算机相关专业的正在做课程设计、期末大作业的学生和需要项目实战练习的学习者。 基于Python的PCA人脸识别算法的原理及实现代码详解(优质项目).zip个人经导师指导并认可通过的98分课程设计项目,主要针对计算机相关专业的正在做课程设

    python180数学函数绘图软件cs.zip

    python180数学函数绘图软件cs.zip

    2013年教育学311专业基础综合真题.pdf

    教育学考研,考研真题,全国硕士研究生统一考试教育学专业基础综合真题及解析,311历年真题,参考答案,答案解析。教育学统考。

Global site tag (gtag.js) - Google Analytics