java对oracle中blob字段的操作
2008-08-27 15:52
411 查看
写这篇博客之前,我写了关于java操作oracle中clob类行的字段。今天我要写下java操作oracle中blob类型的字段。数据的表结构我如图片所示。里面标记了颜色就是重要的哦 ^_^
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.BLOB;
/**
* 本类是对oracle数据库进行增删改查操作
* @author LoongHua
*
*/
public class OperateBlobDao {
private Connection conn;
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.6:1521:findata","system","123456");
} catch (Exception e) {
System.out.println("得到数据库连接发生异常");
e.printStackTrace();
}
return conn;
}
public OperateBlobDao(Connection conn){
this.conn=conn;
}
/**
* 想数据中插入一个2进制文章,如图片
* @param fileName 文件名
* @param filePath 文件路径
* @return 是否插入成功
*/
public boolean insert(String fileName, String filePath) {
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
/*
* 插入所有的数据,插入BLOB字段的列是使用函数empty_blob(),这样系统会创建一个本地化的BLOB数据类型。
*/
query = "insert into aaa(id,name,photo) values (aaa_id.nextval,'"+fileName+"', empty_blob())";
stmt.executeUpdate(query);
/*
*得到刚才插入的记录
*/
query = "select * from aaa where id=(select max(id) from aaa)";
rs = stmt.executeQuery(query);
if (rs.next()) {
// 向BLOB类型变量里插入数据
BLOB blob = ((OracleResultSet)rs).getBLOB("photo");
os = blob.getBinaryOutputStream();
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer = new byte[blob.getBufferSize()];
int bytesRead = 0;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.flush();
//清空blob类型
blob = null;
return true;
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(is != null) {
is.close();
}
if(os != null) {
os.close();
}
if(stmt != null) {
stmt.close();
}
if(rs != null) {
rs.close();
}
if(conn != null) {
conn.commit();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 用指定的包含文件名的文件路径替换指定名称的文件
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
* @return 是否成功,成功为true,否则为false
*/
public boolean update(String fileName, String filePath){
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
//记得这里一定要加上 for update 不然会报 blob未锁定错误
/*
* 当然也可以用别的方法更新,比如可以先设置photo字段为empty_blob()
* 然后在向blob插入新的数据,就象对clob操作那篇博客那样做也是可以的。
*/
query="select * from aaa where name='"+fileName+"' for update";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
os = blob.getBinaryOutputStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 查询指定文件名的一张图片,如果存在则保存到本机的D盘下
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
*/
public void select(String fileName,String filePath){
if(conn==null){
return ;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="select * from aaa where name='"+fileName+"'";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
os = new FileOutputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
is = blob.getBinaryStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.setAutoCommit(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 删除指定的文件名的文件
* @param fileName 指定的文件名
* @return 是否成功,成功为true,否则为false
*/
public boolean delete(String fileName){
if(conn==null){
return false;
}
Statement stmt = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="delete from aaa where name='"+fileName+"'";
int row=stmt.executeUpdate(query);
if(row>0){
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 关闭数据库
*/
public void close(){
try {
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Connection conn=getConnection();
OperateBlobDao obdao=new OperateBlobDao(conn);
// boolean flag=obdao.insert("123.JPG", "d:/123.JPG");
// if(flag){
// System.out.println("插入成功!");
// }
// obdao.select("123.JPG", "d:/123.JPG");
// boolean flag=obdao.delete("123.JPG");
// if(flag){
// System.out.println("删除成功!");
// }
boolean flag=obdao.update("xxgz.pdf", "d:/123.JPG");
if(flag){
System.out.println("更新成功!");
}
obdao.close();
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.BLOB;
/**
* 本类是对oracle数据库进行增删改查操作
* @author LoongHua
*
*/
public class OperateBlobDao {
private Connection conn;
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.6:1521:findata","system","123456");
} catch (Exception e) {
System.out.println("得到数据库连接发生异常");
e.printStackTrace();
}
return conn;
}
public OperateBlobDao(Connection conn){
this.conn=conn;
}
/**
* 想数据中插入一个2进制文章,如图片
* @param fileName 文件名
* @param filePath 文件路径
* @return 是否插入成功
*/
public boolean insert(String fileName, String filePath) {
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
/*
* 插入所有的数据,插入BLOB字段的列是使用函数empty_blob(),这样系统会创建一个本地化的BLOB数据类型。
*/
query = "insert into aaa(id,name,photo) values (aaa_id.nextval,'"+fileName+"', empty_blob())";
stmt.executeUpdate(query);
/*
*得到刚才插入的记录
*/
query = "select * from aaa where id=(select max(id) from aaa)";
rs = stmt.executeQuery(query);
if (rs.next()) {
// 向BLOB类型变量里插入数据
BLOB blob = ((OracleResultSet)rs).getBLOB("photo");
os = blob.getBinaryOutputStream();
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer = new byte[blob.getBufferSize()];
int bytesRead = 0;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.flush();
//清空blob类型
blob = null;
return true;
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(is != null) {
is.close();
}
if(os != null) {
os.close();
}
if(stmt != null) {
stmt.close();
}
if(rs != null) {
rs.close();
}
if(conn != null) {
conn.commit();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 用指定的包含文件名的文件路径替换指定名称的文件
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
* @return 是否成功,成功为true,否则为false
*/
public boolean update(String fileName, String filePath){
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
//记得这里一定要加上 for update 不然会报 blob未锁定错误
/*
* 当然也可以用别的方法更新,比如可以先设置photo字段为empty_blob()
* 然后在向blob插入新的数据,就象对clob操作那篇博客那样做也是可以的。
*/
query="select * from aaa where name='"+fileName+"' for update";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
os = blob.getBinaryOutputStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 查询指定文件名的一张图片,如果存在则保存到本机的D盘下
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
*/
public void select(String fileName,String filePath){
if(conn==null){
return ;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="select * from aaa where name='"+fileName+"'";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
os = new FileOutputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
is = blob.getBinaryStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.setAutoCommit(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 删除指定的文件名的文件
* @param fileName 指定的文件名
* @return 是否成功,成功为true,否则为false
*/
public boolean delete(String fileName){
if(conn==null){
return false;
}
Statement stmt = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="delete from aaa where name='"+fileName+"'";
int row=stmt.executeUpdate(query);
if(row>0){
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 关闭数据库
*/
public void close(){
try {
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Connection conn=getConnection();
OperateBlobDao obdao=new OperateBlobDao(conn);
// boolean flag=obdao.insert("123.JPG", "d:/123.JPG");
// if(flag){
// System.out.println("插入成功!");
// }
// obdao.select("123.JPG", "d:/123.JPG");
// boolean flag=obdao.delete("123.JPG");
// if(flag){
// System.out.println("删除成功!");
// }
boolean flag=obdao.update("xxgz.pdf", "d:/123.JPG");
if(flag){
System.out.println("更新成功!");
}
obdao.close();
}
}
相关文章推荐
- JAVA对Oracle中BLOB、CLOB类型字段的操作说明
- Hibernate操作Blob类型字段出现java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.getBlob(Ljava/lang/String;)Ljava/sql/
- 从 Oracle 大字段(blob,clob)的读、写认识 Java JDBC操作全攻略
- java 操作blob、clob大字段代码示例
- java hibernate 映射和注解oracle含有blob字段的数据表的pojo源码
- java操作oracle数据库中的blob字段
- 用oracle的java存储过程实现BLOB字段的字符串读取
- 使用java语言操作,如何来实现MySQL中Blob字段的存取
- JAVA操作Oracle中BLOB、CLOB
- 用java和oracle实现BLOB字段的字符串读取【转】
- 利用Java代码把oracle的blob字段内容解析成XML格式的字符串
- (转)通过JDBC 操作 ORACLE BLOB,CLOB字段类型
- JAVA读取Oracle中的blob图片字段并显示
- JAVA读取Oracle中的blob图片字段并显示
- JAVA读取Oracle中的blob图片字段并显示
- java oracle blob字段的插入
- java操作Oracle大数据类型BLOB的存取
- 使用java JDBC方式操作oracle blob类型数据
- [转贴]Java中操作数据库的Blob字段,将文件写入数据库!!!
- Java更新数据库的大字段blob,包括oracle和db2