设为首页 收藏本站
查看: 831|回复: 0

[经验分享] java操作Oracle数据库中的Clob,Blob字段

[复制链接]

尚未签到

发表于 2016-8-6 13:20:13 | 显示全部楼层 |阅读模式
说明1:首先所有的文件都是以二进制存储
2:二进制文件有.doc .xls .jpg
文本文件有   .txt .html .xml
先在oracle数据库中建一张表用与测试
create table CDL_TEST
(
SID  VARCHAR2(20) not null,
IMG  BLOB,       //存储二进制
DOC  CLOB,     //存储文本
DATA NUMBER
)
-- 约束
alter table CDL_TEST
add constraint CDL_SID primary key (SID)

测试代码如下:
package DataBaseUtil;
import java.sql.*;
import java.util.Scanner;
import java.io.*;
import oracle.sql.BLOB;
class InitDB{
private static Connection con=null;
private static Statement stmt=null;
private static ResultSet rs=null;
InitDB(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
String url="jdbc:oracle:thin:@localhost:1521:ORCL";  //ORCL 是sid
String user="cdl";  
String password="1";  
con= (Connection) DriverManager.getConnection(url,user,password);
InitDB.setCon(con);
}catch(Exception e){
e.printStackTrace();
}
}
public void closCon(){
try{
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
public void stmt(){
try{
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
public void rs(){
try{
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection getCon() {
return con;
}
public static void setCon(Connection con) {
InitDB.con = con;
}
public static ResultSet getRs() {
return rs;
}
public static void setRs(ResultSet rs) {
InitDB.rs = rs;
}
public static Statement getStmt() {
return stmt;
}
public static void setStmt(Statement stmt) {
InitDB.stmt = stmt;
}
}
/*
* 插入Blob数据 如:图片
*/
class InsertBlobData{
private ResultSet rs=null;
private InitDB idb=null;
InsertBlobData(){
idb=new InitDB();
}
public  void insertBlob(String sql1) throws SQLException{
Connection con=idb.getCon();
try{
con.setAutoCommit(false);//不设置自动提交
BLOB blob = null; //插入空的Blob
PreparedStatement pstmt = con.prepareStatement("insert into cdl_test(sid,img) values(?,empty_blob())");
pstmt.setString(1,"100");
pstmt.executeUpdate();
pstmt.close();
rs=con.createStatement().executeQuery(sql1);
while(rs.next()){
System.out.println("rs length is:");
oracle.sql.BLOB  b=(oracle.sql.BLOB )rs.getBlob("img");
System.out.println("cloblength is:"+b.getLength());
File f=new File("d:\\img\\1.jpg");
System.out.println("file path is:"+f.getAbsolutePath());
BufferedInputStream in=new BufferedInputStream(new FileInputStream(f));  
BufferedOutputStream  out=new BufferedOutputStream(b.getBinaryOutputStream());
int   c;   
while ((c=in.read())!=-1)   {   
out.write(c);   
}   
in.close();   
out.close();
}
con.commit();
}catch(Exception e){
con.rollback();//出错回滚
e.printStackTrace();
}
}
}
/*
* 插入大文本如:1.txt
*/
class InsertClobData{
private ResultSet rs=null;
private InitDB idb=null;
InsertClobData(){
idb=new InitDB();
}
public  void insertClob(String sql1) throws SQLException{
Connection con=idb.getCon();
try{
con.setAutoCommit(false);//不设置自动提交
BLOB blob = null; //插入空的Clob
PreparedStatement pstmt = con.prepareStatement("insert into cdl_test(sid,doc) values(?,empty_clob())");
pstmt.setString(1,"101");
pstmt.executeUpdate();
pstmt.close();
rs=con.createStatement().executeQuery(sql1);
while(rs.next()){
System.out.println("sdfasdfas");
oracle.sql.CLOB  cb=(oracle.sql.CLOB)rs.getClob("doc");
File f=new File("d:\\doc\\1.txt");
System.out.println("file path is:"+f.getAbsolutePath());
BufferedWriter out = new BufferedWriter(cb.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(f));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();   
out.close();
}
con.commit();
}catch(Exception e){
con.rollback();//出错回滚
e.printStackTrace();
}
}
}
/*
* 读取图片
*/
class ReadBlobData{
private ResultSet rs=null;
private InitDB idb=null;
ReadBlobData(){
idb=new InitDB();
}
public void getBlob(String sql2) throws SQLException{
Connection con=idb.getCon();
con.setAutoCommit(false);
try{
System.out.println("sq2 is:"+sql2);
System.out.println("stmt is:"+con);
rs=con.createStatement().executeQuery(sql2);
while(rs.next()){
System.out.println("rs length is:");
Blob b=(Blob)rs.getBlob("img");
File f=new File("D:\\saveimg\\1.jpg");
FileOutputStream fos=new FileOutputStream(f);
InputStream is=b.getBinaryStream();//读出数据后转换为二进制流
byte[] data=new byte[1024];
while(is.read(data)!=-1){
fos.write(data);
}
fos.close();
is.close();
}
con.commit();//正式提交
}catch(Exception e){
e.printStackTrace();
}finally{
//rs.close();
}
}
}
/*
* 读取大文本
*/
class ReadClobData{
private ResultSet rs=null;
private InitDB idb=null;
ReadClobData(){
idb=new InitDB();
}
public void getClob(String sql2) throws SQLException{
Connection con=idb.getCon();
try{
con.setAutoCommit(false);//不设置自动提交
System.out.println("sq2 is:"+sql2);
rs=con.createStatement().executeQuery(sql2);
while(rs.next()){
oracle.sql.CLOB clob=(oracle.sql.CLOB)rs.getClob("doc");
File f=new File("d:\\savedoc\\1.txt");
BufferedReader in = new BufferedReader(clob.getCharacterStream());
//setCharacterStream()方法,可用于将CLOB字段与字节流相关联,
BufferedWriter out = new BufferedWriter(new FileWriter(f));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
out.close();
in.close();
}
con.commit();//正式提交
rs.close();
}catch(Exception e){
e.printStackTrace();
con.rollback();
}
}
}
public class TestBlob {
public static void main(String []args){
String sql1="select * from cdl_test  for update";//悲观锁锁定需更新的行
String sql2="select * from cdl_test";
System.out.println("\t\t\t欢迎使用:");
System.out.println("1:插入图片");
System.out.println("2:插入文本");
System.out.println("3:读取图片");
System.out.println("4:读取文本");
System.out.println("5:退出");
System.out.println("请选择:")
while(true){
try{
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
System.out.println("sss:"+i);
switch(i){
case 1:
InsertBlobData isd=new InsertBlobData();
isd.insertBlob(sql1); break;
case 2:
InsertClobData icd=new InsertClobData();
icd.insertClob(sql1); break;
case 3:
ReadBlobData rb=new ReadBlobData();
rb.getBlob(sql2); break;
case 4:
ReadClobData rc=new ReadClobData();
rc.getClob(sql2); break;
case 5:
System.exit(0);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253703-1-1.html 上篇帖子: oracle中blob,clob字段的操作问题 下篇帖子: Oracle 动态性能表 v$session & v$process
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表