JDBC中操作Blob、Clob等对象

很多网友都不知道JDBC中如何操作Blob、Clob等对象,其实这是不难的!操作这些对象就象操作其它String、int一样。不信!你就看下面的文章。下面的例子会带你首先创建包含Clob、Blob对象的数据库的表,然后写入这些对象,最后再读取并操作这些对象!

一、关于Derby

www.open-open.com是这样介绍Derby的“Apache Derby 是一种高质量的、纯 Java 的嵌入式关系数据库引擎,IBM 最近已将其捐献给开放源码社区。Derby 数据库基于文件系统,具有高度的可移植性,并且是轻量级的,这使得它非常便于发布。”据说它的源代码价值几十亿美元哦!我一般使用Derby,因为使用它可以很多其它开源数据库不能完成的操作,它是一个与JDBC标准完全兼容的数据库产品,再说它是IT界泰斗IBM的开源项目,能不去好好研究,多多学习吗?!

下载该软件你可以去www.open-open.com、www.sourceforge.net。下载下来后将其db-derby-10.XXXX-lib.zip解压放到一个目录下(看到了吧,基本都是jar文件,我放在c:\Derby目录中),同时让你的classpath中包含derby.jar文件,这样我们就可以在程序中使用该库了!

简单讲述path和classpath吧!设置path的目的是:当你使用java、javac、rmic命令时系统会到指定的path下查找这些.exe或.com文件然后执行它,我们要使用java中的这些工具,当然在path环境变量中要包含它们所在的目录了。classpath也差不多,当你在java中要调用其它已经有的类时,必须包含该类所在的目录,这样就可以调用了!例如在使用javac编译servlet时,sun提供的servlet的包必须在你的classpath中。

下面就开始我们的例子吧!

二、一个简单例子

本例中先创建一个包含Blob和Clob对象的数据库的表,然后向此表中写入Blob和Clob对象,最后再将这些数据库表中的数据读出并处理。其中使用了PreparedStatement对象、运用了一些和IO相关的知识。我们在此程序里使用了两种流的处理方式。下面是源代码:

import java.io.*;
import java.sql.*;
public class BlobClobExample {
public static void main(String[] args) {
try {
String url = "jdbc:derby:clobberyclob;create=true";
//Derby中的URL,后面是附加参数。表示数据库中没有此数据库时,会自动建一个
//其它数据库提供商的产品可以查阅其手册
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
//加载驱动。关于加载驱动的细节,请阅读本博客的《JDBC中驱动加载的过程分析(上)》
//和《JDBC中驱动加载的过程分析(下)》
//在数据库Mysql的驱动加载时也建议在Class.forName()后,继续调用newInstance()方法
2
//没有本质区别
Connection conn = DriverManager.getConnection(url); //建立连接
Statement s = conn.createStatement(); //创建Statement对象
s.executeUpdate("drop table documents");
//这句是为了避免再次创建表documents
s.executeUpdate("CREATE TABLE documents(id INT, text CLOB(64 K) , photo Blob(1440 K))");
//以上就是创建包含Clob和Blob对象的表的过程
//和将一般的字段差不多,后面括号中代表该对象的大小,其语法为:
// CLOB (length [{{K |M |G}]) 表示长度为K、M、G等,没有带表示比特
conn.commit(); //提交操作
//以下是将本地文件中,本程序的源文件加载为一个流,用于向数据库中写入Clob字段
File file1 = new File("BlobClobExample.java");
int len1 = (int) file1.length();
InputStream fis1 = new java.io.FileInputStream(file1);
//以下是将当前源代码目录的子目录“11”下的“1.JPG”文件加载为一个流,
//用于后面向数据库中写入Blob字段
File file2 = new File("c:\\11\\1.JPG");
int len2 = (int) file2.length();
InputStream fis2 = new FileInputStream(file2);
//以上两个简单吧!!
//创建一个PreparedStatement对象,用于批量插入内容
//使用PreparedStatement对象可以节省,数据库编译SQL指令的时间,
//因为在使用PreparedStatement对象时,该SQL语句是预先编译好了,
//对于某些变化的参数使用占位符(Place Holder)代替
//这对于以后将要执行多次的同一操作,该操作仅仅是参数不同,是极其有利
//比如在网页上输入客户信息时,用户要填入的数据基本是一样的(你可以填也可以不填)
//这时后台的数据库可以使用PreparedStatement对象,每次都是设置参数,执行操作
PreparedStatement ps = conn.prepareStatement("INSERT INTO documents VALUES (?, ?,?)");
ps.setInt(1, 250);
ps.setAsciiStream(2, fis1, len1);
ps.setBinaryStream(3,fis2,len2);
//以上三步是设置占位符的数值
ps.execute(); //执行操作
//以上四步可以重复执行。PreparedStatement就是为了适用于此用途
conn.commit();
//以上完成了数据的写入
//以下是数据的读出
ResultSet rs = s.executeQuery("SELECT text , photo FROM documents WHERE id = 250");
while (rs.next()) {
Clob aclob = rs.getClob(1); //和提取一般对象一样
InputStream is = rs.getAsciiStream(1); //特殊的,对于与得到Clob的流
//这是得到Clob、Blob流的第一种方法
3
//以下是对流进行处理的过程。Clob本身是包含大字符的对象
//顺其自然,以下是使用java IO中读取字符流的方法读取它
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null ;
while(null != (line = br.readLine())){
System.out.println(line); //将其输出至屏幕,实际你可以按照需要处理
}
is.close();
java.sql.Blob ablob = rs.getBlob(2); //和操作其它基本类型的字段一样
System.out.println(ablob.length()); //简单地操作Blob的实例
//实际你可以使用Clob的API对其进行任何它允许的操作,请查API
InputStream bis = ablob.getBinaryStream() ; //得到Blob实例的字节流
//这是操作Clob、Blob等对象的第二种方法,也是最自然的用法
OutputStream os = new FileOutputStream("11.jpg");
//用于将数据库中的Blob存放到目前目录的“11.jpg”文件中
int b = bis.read(); //以下就是象操作其它java字节流一样操作了
while (b != -1 ) {
os.write((char)b);
b = bis.read();
}
os.flush();
os.close();
bis.close();
}
} catch (Exception e) {
System.out.println("Error! "+e);
}
}
}

简单吧!实际上写入Blob和Clob对象时一般只能使用PreparedStatement对象,一般使用其setXXXStream写入流。写就是这么简单!看完了,研究一下API吧!读出时一般通过getClob()、getBlob()方法,和其它提取基本数据类型字段的方法完全相同,接着你就可以得到此Clob、Blob实例的流了,有了流就可以象处理其它流一样处理这些流了!

简单吧!关键是一定要对基本流程了解!对其原来了解!对什么IO、net、Collections….基础知识必须精通!

运行的结果是本程序的源代码会存储在数据库中,同时会在屏幕上显式,源代码目录的子目录“11”下的1.jpg会存储到数据库中,同时也会在当前目录下有一个该文件的副本。(图片的相对位置一定要搞对哦!)

时间: 2024-11-04 18:03:06

JDBC中操作Blob、Clob等对象的相关文章

关于C#中操作EXCEL后,关闭对象但EXCEL进程仍然存在的解决办法.

问题描述 自己之前一直被这个问题困扰,也在网上找了很多资料,大部分都是用杀死进程的方法来解决,个人觉得这个太影响代码美观了.今天偶然发现了解决办法.给大家共享一下.现象:我在C#中,需要从EXCEL导入或者导出数据,当导入导出结束后,使用excelApp.Quit()关闭EXCEL对象,但系统进程中仍然存在EXCEL进程.并没有关闭.原因:其实excelApp.Quit();方法是可以正确的释放EXCEL进程的,我们导入导出EXCEL时,普遍方法是代码后台处理,前台并隐藏EXCEL界面,也就是e

如何操作BLOB、CLOB、BFILE

BFILE        二进制文件,存储在数据库外的操作系统文件,只读的.把此文件当二进制处理. BLOB        二进制大对象.存储在数据库里的大对象,一般是图像声音等文件. CLOB        字符型大对象.一般存储大数量文本信息.存储单字节,固定宽度的数据. NCLOB        字节字符大对象.存储单字节大块,多字节固定宽度,多字节变宽度数据 BFILE The BFILE data type enables access to binary file LOBs that

Java从数据库中读取Blob对象图片并显示的方法_java

本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法.分享给大家供大家参考.具体实现方法如下: 第一种方法: 大致方法就是,从数据库中读出Blob的流来,写到页面中去: 复制代码 代码如下: Connection conn = DBManager.getConnection();   String sql = "SELECT picture FROM teacher WHERE id=1";   PreparedStatement ps = null;   ResultSe

Java的JDBC中Statement与CallableStatement对象实例_java

JDBC Statement对象实例以下是利用以下三种查询以及打开和关闭说明的例子: boolean execute(String SQL) : 返回一个布尔值true,如果ResultSet对象可以被检索,否则返回false.使用这个方法来执行SQL DDL语句,或当需要使用真正的动态SQL. int executeUpdate(String SQL) : 返回受影响的SQL语句执行的行数.使用此方法来执行,而希望得到一些受影响的行的SQL语句 - 例如,INSERT,UPDATE或DELET

详解Java的JDBC中Statement与PreparedStatement对象_java

一旦获得一个连接,我们可以与数据库进行交互.在JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送SQL或PL/SQL命令和从数据库接收数据. 它们还定义方法,帮助Java和数据库使用SQL数据类型之间转换数据的差异. 下表提供了每个接口的用途概要,了解决定使用哪个接口 Statement 对象: 创建Statement对象在可以使用Statement对象执行SQL语句,需要使用Connection对象的cr

浅谈实际开发中数据源在JDBC中的应用

数据|数据源 数据源在JDBC中的应用众所周知,JDBC(Java数据库连接)是Java2企业版的重要组成部分.它是基于SQL层的API.通过把SQL语句嵌入JDBC接口的方法中,用户可以通过Java程序执行几乎所有的数据库操作. JDBC只提供了接口,具体的类的实现要求数据库的设计者完成.通过生成这些接口的实例,即使对于不同的数据库,Java程序也可以正确地执行SQL调用.所以对于程序员来说,不必把注意力放在如何向数据库发送SQL指令,因为程序员需要了解和用到的只是JDBC的接口,只有在极少数

Oracle中提取和存储数据库对象的DDL

oracle|对象|数据|数据库     从对象(例如数据库表.索引.约束.触发器等)中提取DDL命令的普通方法涉及到的操作包括从这些对象中提取元数据(metadata),并把这些数据存储在内存中.尽管目前有很多脚本可以实现这样的功能,但是它们通常都是不完整的或者过时的.幸运的是,Oracle 9.2提供了一个实现这样的功能的API:DBMS_METADATA程序包. 在很多情况下,数据库中数据的维护操作要求我们提取多种对象(例如数据库表.索引.约束.触发器等)的DDL(Data Definit

JDBC中的Statement和PreparedStatement的区别

以Oracle为例吧 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句select colume from table where colume=1; select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划

Python中操作列表之List.append()方法的使用

  这篇文章主要介绍了在Python中操作列表之List.append()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 append()方法追加传递obj到现有的列表. 语法 以下是append()方法的语法: ? 1 list.append(obj) 参数 obj -- 这是在列表中要追加的对象. 返回值 此方法不返回任何值,但更新现有的列表. 例子 下面的例子显示了append()方法的使用. ? 1 2 3 4 5 #!/usr/bin/python   aList