好记性不如烂笔头18-java对Oracle的CLOB字段的操作

分布式文件系统的发展很快,在Oracle中,LOB(Large Object,大型对象)类型的字段现在虽然用的没有以前那么多了。但是在一些特殊的场合,需要用它保存一些数据量非常大的业务领域(如图象、档案等),还是有不少的市场。

  LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(BinaryLarge Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作,房地产交易数据和文档的记录等)。

1、准备工作

有一个能正常访问ORACLE的应用。

创建一张测试的表:

数据库

CREATE TABLE ffm_CLOB ( ID NUMBER(3),CLOBCOL CLOB)

2、Java对Oracle的clob字段进行写入、读取、修改的源代码

package com.db;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.InputStreamReader;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**

* 简单的对ORACLE中的CLOB字段写、读、修改

* @author 范芳铭

*/

public class EasyClob {

public staticvoid main(String[] args) throws Exception {

EasyClobclob = new EasyClob();

clob.clobWrite("D:/ffm83/ffm83.txt");

//clob.clobRead("D:/ffm83/clobRead.txt");

}

public voidclobWrite(String filePath) throws Exception {

Connectionconn = null;

PreparedStatementstmt = null;

ResultSet rs= null;

try {

conn = Log4JDBCTest.getConnBM();

booleandefaultCommit = conn.getAutoCommit();

/* 开启事务,设定不自动提交 */

conn.setAutoCommit(false);

/* 插入一个空的CLOB对象 */

Stringsql = "INSERT INTO ffm_CLOB VALUES (?, EMPTY_CLOB())";

stmt =conn.prepareStatement(sql);

stmt.setInt(1,1);

stmt.executeUpdate();

/* 查询此CLOB对象并锁定 */

sql ="SELECT CLOBCOL FROM ffm_CLOB WHERE ID=? FOR UPDATE";

stmt =conn.prepareStatement(sql);

stmt.setInt(1,1);

rs =stmt.executeQuery();

if(rs.next()) {

/* 取出此CLOB对象 */

oracle.sql.CLOBclob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");

/* 向CLOB对象中写入数据 */

BufferedWriterout = new BufferedWriter(clob.getCharacterOutputStream());

InputStreamReaderisr = new InputStreamReader(new FileInputStream(filePath), "UTF-8");

BufferedReaderin = new BufferedReader(isr);

intc;

while((c = in.read()) != -1) {

out.write(c);

System.out.println(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch(Exception ex) {

conn.rollback();

throwex;

} finally {

try {

stmt.close();

conn.close();

} catch(SQLException e) {

e.printStackTrace();

}

}

}

public voidclobRead(String outFile) throws Exception {

Connectionconn = null;

PreparedStatementstmt = null;

ResultSet rs= null;

try {

conn =Log4JDBCTest.getConnBM();

booleandefaultCommit = conn.getAutoCommit();

/* 开启事务,设定不自动提交 */

conn.setAutoCommit(false);

/* 查询CLOB对象 */

Stringsql = "SELECT * FROM ffm_CLOB WHERE ID=?";

stmt =conn.prepareStatement(sql);

stmt.setInt(1,1);

rs =stmt.executeQuery();

if(rs.next()) {

/* 获取CLOB对象 */

oracle.sql.CLOBclob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");

/* 以字符形式输出 */

BufferedReaderin = new BufferedReader(

clob.getCharacterStream());

BufferedWriterout = new BufferedWriter(new FileWriter(outFile));

intc;

while((c = in.read()) != -1) {

out.write(c);

}

out.close();

in.close();

}

} catch(Exception ex) {

conn.rollback();

throwex;

} finally {

try {

stmt.close();

conn.close();

} catch(SQLException e) {

e.printStackTrace();

}

}

}

public voidclobModify(String filePath) throws Exception {

Connectionconn = null;

PreparedStatementstmt = null;

ResultSet rs= null;

try {

conn =Log4JDBCTest.getConnBM();

booleandefaultCommit = conn.getAutoCommit();

/* 开启事务,设定不自动提交 */

conn.setAutoCommit(false);

/* 查询CLOB对象并锁定 */

Stringsql = "SELECT CLOBCOL FROM ffm_CLOB WHERE ID=? FOR UPDATE";

stmt =conn.prepareStatement(sql);

stmt.setInt(1,1);

rs =stmt.executeQuery();

if(rs.next()) {

/* 获取此CLOB对象 */

oracle.sql.CLOBclob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");

/* 进行覆盖式修改 */

BufferedWriterout = new BufferedWriter(

clob.getCharacterOutputStream());

InputStreamReaderisr = new InputStreamReader(new FileInputStream(filePath), "UTF-8");

BufferedReaderin = new BufferedReader(isr);

intc;

while((c = in.read()) != -1) {

out.write(c);

}

in.close();

out.close();

}

/* 提交事务 */

conn.commit();

} catch(Exception ex) {

conn.rollback();

throwex;

} finally {

try {

stmt.close();

conn.close();

} catch(SQLException e) {

e.printStackTrace();

}

}

}

}

3、Java对Oracle的clob字段的中文乱码的处理

在上面的代码中,如果我用一个新建一个普通的txt文件,这个文件中只有英文或者数字的话,那么无论怎么写,都没有乱码问题,如果文件中包含了中文等字符,非常有可能会造成乱码。(为什么说有可能呢,因为有可能恰恰碰上你的数据库的编码和文件中的编码一致)。

比如这样的一段代码,在网上很流行:

/* 取出此CLOB对象 */

oracle.sql.CLOBclob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");

/*向CLOB对象中写入数据 */

BufferedWriterout = new BufferedWriter(clob.getCharacterOutputStream());

BufferedReaderin = new BufferedReader(new FileReader(filePath));

这段代码没有人为的设置读入数据的编码格式,那么一切都只能碰运气。

为了确保编码的一致性,更加为了确保数据的正常保存,推荐使用下面的方式:

读取txt文件乱码:

//BufferedReaderin = new BufferedReader(new FileReader(filePath));

解决办法:

InputStreamReaderisr = new InputStreamReader(new FileInputStream(filePath), "UTF-8");

BufferedReaderin = new BufferedReader(isr);

如果你用的也是txt文本文件在测试,那么有可能读出来的也是乱码,为什么呢?因为txt文本默认不是utf-8的编码格式。

点击文件的“另存为”,在弹出框的下面选择编码格式,有一个“utf-8”的选项,选择它,然后进行测试就可以了。

时间: 2024-11-03 20:44:49

好记性不如烂笔头18-java对Oracle的CLOB字段的操作的相关文章

好记性不如烂笔头20-java对oracle的clob和blob字段的总结

整体情况 CLOB字段在实际工作中,还是有很多的应用场景:但是BLOB字段在现在的大型系统中,作用越来越不尽如人意. 因为数据库资源,在大型系统中,升级成本是最高的:而BLOB字段中大量的数据,会给数据库造成严重的IO问题.如果我们购买几百万的小型机,就是为了存放几张普通图片,估计会被人把牙齿笑掉:虽然数据库有良好的认证系统,但是不代表用文件系统不能实现. 因此,如果是老的系统,如果我们不打算全面重构和升级,那么这个BLOB改用还是要用:如果是新的系统,原则上不推荐BLOB字段,实现的代价较高,

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

从“好记性不如烂笔头”“记问之学不足为人师”到“一事不知是我之耻”

“好记性不如烂笔头”错在一笔记容易丢失,二考验随时发生而笔记常不随身.因此记到大脑里最可靠. “记问之学不足为人师”错在低估记忆力的作用而盲目推崇推理逻辑,这像不打地基盖楼,要不不牢靠要不会垮. “一事不知是我之耻”这是一种认真积极的态度,这样才能应付随时出现的挑战. 2017年3月12日00:34:22

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

好记性不如烂笔头

今天再次深刻领悟这个技能.tm竟然忘记博客园的用户名了.... 好记性不如烂笔头,布布扣,bubuko.com

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram

博客开通啦,好记性不如烂笔头

好记性不如烂笔头,勤能补拙.2016年,我即将步入工作,结束十多年的学生生活.如果说,人生每一个阶段都是一个新的开始,那么,今年又是我新生的一年. 新年新希望, 第一:希望自己能够工作顺利,在自己的岗位上做一个称职又出色的员工 第二:希望自己能够每天都开开心心的 第三:努力变美,努力减肥.多读书,多看报,少吃零食多运动- 第四:努力学习.学习才能使自己更上一层楼,才能让自己实现自己的愿望,学无止境,自制,坚持,总结,记录. 第五:希望家人和朋友们都开开心心的,心想事成万事如意. 第六:希望,我和

好记性不如烂笔头(零)

俗话说,好记性不如烂笔头! 在平常的开发工作中,很多时候我们都会用到一些代码量比较小,但是却很有用的功能,但是,都只是写过就算,下一次再想起来用的时候,已经不知道该去哪儿找了. 常常因为这些小点而浪费时间,也随着年纪渐长,智商有限,还是靠记下来,以备不时之需呀. 获取圆形图片 /** * bitmap 要进行剪裁的位图 * size 剪裁的圆形图片的大小 */ public static Bitmap getCroppedRoundBitmap(Bitmap bitmap, int size)