JAVA操作ORACLE大对象
一:操作CLOB
(1)数据库表结构如下:
create table CLOB_TEST
(
ID VARCHAR2(5) not null,
CONTENT CLOB
)
(2)插入CLOB
方法一:第一步插入一个空值,第二步锁住此行,更新clob字段
public static void insertClob(Connection conn,String data) throws Exception{ //这句话如没有,9i的驱动下会报 java.sql.SQLException: ORA-01002: 读取违反顺序 的异常。 conn.setAutoCommit(false);
//插入一个空CLOB String insertSql = "insert into clob_test(id,content) values('1',empty_clob())"; //查询插入的空CLOB String selectSql = "select content from clob_test where id = '1' for update"; PreparedStatement stmt = conn.prepareStatement(insertSql); stmt.executeUpdate(); stmt.close(); // lock this line PreparedStatement pstmt = conn.prepareStatement(selectSql); ResultSet rs = pstmt.executeQuery(); if(rs.next()){ oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1); //为CLOB写信息 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); BufferedReader in = new BufferedReader(new FileReader(data)); int c; while ((c=in.read())!=-1) { out.write(c); } in.close(); out.close(); } conn.commit(); pstmt.close(); }
注:此方法在jdk1.4、jdk50、jdk6.0和Oracle9i、Oracle10g、Oracle11g驱动下测试通过!
方法二:通过setString方法
public static void insertClob(Connection conn,String data) throws Exception{ String insertSql = "insert into clob_test(id,content) values('1',?)"; PreparedStatement stmt = conn.prepareStatement(insertSql); stmt.setString(1, data); stmt.executeUpdate(); stmt.close(); conn.close();
}
注:由于在Oracle9i的驱动下,setString 有2000字符长度的限制,故这个方法只适合Oracle10g以上的驱动(Oracle11g驱动+JDK6.0也测试通过)。
方法三:通过setClob方法
public static void insertClob(Connection conn,String filePath) throws Exception{ String insertSql = "insert into clob_test(id,content) values('1',?)"; PreparedStatement stmt = conn.prepareStatement(insertSql); stmt.setClob(1, new FileReader(filePath)); stmt.executeUpdate(); stmt.close(); conn.commit(); }
注:由于setClob(int parameterIndex, Reader reader)这个方法是JDBC4.0规范刚加的内容,是以流的方式为CLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
(3)读取CLOB
方法一:
public static String readClob(Connection conn) throws Exception{ PreparedStatement stmt = conn.prepareStatement("select * from clob_test where id = '1'"); ResultSet rs = stmt.executeQuery(); String str=""; StringBuffer sb = new StringBuffer(""); while(rs.next()){ Clob clob = rs.getClob("content"); Reader is = clob.getCharacterStream(); BufferedReader br = new BufferedReader(is); str = br.readLine(); while (str != null) { sb.append(str); str = br.readLine(); } } return sb.toString(); }
方法二:
public static String readClob(Connection conn) throws Exception{ PreparedStatement stmt = conn.prepareStatement("select * from clob_test where id = '1'"); ResultSet rs = stmt.executeQuery(); String str=""; while(rs.next()){ str = rs.getString("content"); } return str; }
注:由于在Oracle9i的驱动下,rs.getString 返回为null,所以此方法只适合Oracle10g及其以上驱动。
二:操作BLOB
(1)数据库表结构如下:
create table BLOB_TEST
(
ID VARCHAR2(5) not null,
CONTENT BLOB
)
(2)插入BLOB
方法一:第一步插入一个空值,第二步锁住此行,更新blob字段
public static void writeBlob(Connection con,String filePath) throws Exception{ FileInputStream fis = null; PreparedStatement psm = null; File file = new File(filePath); psm = con.prepareStatement("insert into blob_test(id,content) values('2',empty_blob())"); psm.executeUpdate(); psm = con.prepareStatement("select content from blob_test where id ='2' for update"); ResultSet rs = psm.executeQuery(); if(rs.next()){ oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(1); FileInputStream fin = new FileInputStream(file); OutputStream out = blob.getBinaryOutputStream(); int count = -1, total = 0; byte[] data = new byte[blob.getBufferSize()]; while ((count = fin.read(data)) != -1) { out.write(data, 0, count); } out.flush(); out.close();
} }
方法二:通过setBinaryStream方法
public static void writeBlob(Connection con,String filePath) throws Exception{ FileInputStream fis = null; PreparedStatement psm = null; File file = new File(filePath); try { fis = new FileInputStream(file); psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)"); psm.setBinaryStream(1, fis, fis.available()); psm.executeUpdate(); }finally{ if(fis != null) fis.close(); psm.close(); con.close(); } }
方法三:通过setBlob(int parameterIndex, InputStream inputStream)方法
public static void writeBlob(Connection con,String filePath) throws Exception{ FileInputStream fis = null; PreparedStatement psm = null; File file = new File(filePath); try { fis = new FileInputStream(file); psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)"); psm.setBlob(1, fis); psm.executeUpdate(); }finally{ if(fis != null) fis.close(); psm.close(); con.close(); } }
注:由于setBlob(int parameterIndex, InputStream inputStream)这个方法是JDBC4.0规范刚加的内容,是以流的方式为BLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
(3)读取BLOB
public static void readBlob(Connection con,String outFilePath){ Statement sm = null; ResultSet rs = null; try { sm = con.createStatement(); rs = sm.executeQuery("select * from blob_test where id = 2"); if(rs.next()){ Blob blob = rs.getBlob("content"); File file = new File(outFilePath); FileOutputStream sout = new FileOutputStream(file); InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流 //经BLOB输入数据流读取数据,并将其写入文件 byte[] b = new byte[256]; int off = 0; int len = b.length; for (int i = in.read(b); i != -1;) { sout.write(b); i = in.read(b); } sout.close(); rs.close(); sm.close(); con.close(); } } catch (Exception e) { e.printStackTrace(); } }
JAVA操作ORACLE大对象的更多相关文章
- Java操作Oracle
public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...
- java 操作Oracle 批量入库的问题
java 操作Oracle 批量入库的问题 先说下我运行的环境: Windows7 64位操作系统 (四核)Intel i5-2300 CPU @2.80GHz 内存4G 硬盘1T Jdk1.6+My ...
- java操作oracle的blob,clob数据
一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: ...
- JAVA操作ORACLE数据库的存储过程
一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...
- ORACLE大对象存储
--创建有大对象字段的一张表 create table test001 ( fname varchar2(50), content blob ) select * from ...
- Java操作Oracle数据库以及调用存储过程
操作Oracle数据库 publicclass DBConnection { //jdbc:oracle:thin:@localhost:1521:orcl publicstaticf ...
- Java 操作Oracle数据库
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- JAVA处理Blob大对象
Blob对象是SQL Blob的Java语言映射.SQL Blob是一个内置类型,它可以将一个二进制大对象保存在数据库中.接口ResultSet.CallableStatement和PreparedS ...
- Java操作Redis存储对象类型数据
背景描述 关于JAVA去操作Redis时,如何存储一个对象的数据,大家是非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用.存储一个对象是是 ...
随机推荐
- 【转】asp获取【微信公众平台】Access Token的源代码下载
在做微信开发时候,经常要用到Access Token,但是官网提供的都是基于php写的,我用asp写了,有需要可以直接复制去用,模板消息,jdk上传图片,客服消息等全需要这个:'获取 access_t ...
- layui时间控件闪退的问题
项目上线,发现后台管理系统layui的子页面出现时间控件闪退的问题,根本选取不到时间. 其原因是:如果出现页面找到多个节点,只有第一个节点能正常使用后面的节点都会闪退,可以理解为目前laydate不支 ...
- Laya的位图文字
参考: Laya文本 测试版本:Laya 2.1.1.1 大部分游戏都会用到位图文字,例如dnf的伤害数字. 白鹭的位图文字是美术提供0-9十张单张图片,由TextureMerger导出fnt+jso ...
- Linux系统调优——系统整体运行状态排查(七)
(1).vmstat vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的整体状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写 ...
- 123457123456#2#----com.MC.DishuGame368----前拼后广--儿童打地鼠Game-mc2222222
com.MC.DishuGame368----前拼后广--儿童打地鼠Game-mc
- LeetCode_205. Isomorphic Strings
205. Isomorphic Strings Easy Given two strings s and t, determine if they are isomorphic. Two string ...
- Swift4.0复习特性、编译标志和检查API的可用性
1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...
- 【ARTS】01_47_左耳听风-201900930~201901006
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- Keystone
Kenstone各个概念的比喻: User 住宾馆的人 Credentials 开启房间的钥匙 Authentication 宾馆为了拒绝不必要的人进出宾馆,专门设置的机制,只有拥有钥匙的人才能进出 ...
- 13、OpenCV实现图像的空间滤波——图像平滑
1.空间滤波基础概念 1.空间滤波基础 空间滤波一词中滤波取自数字信号处理,指接受或拒绝一定的频率成分,但是空间滤波学习内容实际上和通过傅里叶变换实现的频域的滤波是等效的,故而也称为滤波.空间滤波主要 ...