java向Oracle数据库中插入blob字段数据

java不能直接想插入其他普通类型数据一样插入blob字段数据,因为blob相当于一个大文件块,里面有游标,需要初始化blob游标才能插入数据。所以我们要先插入一个空的blob数据,以初始化游标,然后再往这个blob字段中写入数据,来实现插入blob数据的效果,代码如下:

package controller;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBHelper {
	private static Connection conn;                                        //用于建立数据库连接
	private PreparedStatement pres;                                        //执行sql的preparedStatement
	static{
		try {
			Class.forName("oracle.jdbc.OracleDriver");                     //加载驱动类
			String url="jdbc:oracle:thin:@192.168.75.131:1521:orcl";     //连接数据库的url
			String user="jerry";
			String pwd="jerry";
			
			conn=DriverManager.getConnection(url,user,pwd);                //请求数据库连接
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//写入blob数据
	public void writeBlob(){
		try {
			conn.setAutoCommit(false);                                     //关闭自动提交
			String sql="insert into blobtest values(?,?,?)";               //插入语句
			
			pres=conn.prepareStatement(sql);
			pres.setInt(1, 1);                          
			pres.setString(2, "jerry");
			pres.setBlob(3,oracle.sql.BLOB.getEmptyBLOB());                //先插入空的BLOB,获取游标
			
			pres.executeUpdate();
			
			sql="select photo from blobtest where id=?";
			pres=conn.prepareStatement(sql);
			pres.setInt(1, 1);                                             //找出ID为1的,也就是刚刚插入的
			
			ResultSet res=pres.executeQuery();
			res.next();
			Blob imageBlob=res.getBlob(1);                                 //得到该空的blob
			
			OutputStream os = imageBlob.setBinaryStream(0); 
            // 读取想要存储的图片文件  
            InputStream is = new FileInputStream("G:\\jerry.jpg");  
            // 依次读取流字节,并输出到已定义好的数据库字段中.  
            int i = 0;  
            while ((i = is.read()) != -1) {  
                os.write(i);                                               //Blob的输入流,相当于输入到数据库中
            }  
            os.flush();  
            os.close();  
            conn.commit();  
            conn.setAutoCommit(true);// 恢复现场 
            
            if(res!=null)
            	res.close();
            if(pres!=null)
            	pres.close();
            
            System.out.println("插入成功!!!");
		} catch (SQLException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void getImage(){
		String sql="select photo from blobtest where id=?";
		
		try {
			pres=conn.prepareStatement(sql);
			pres.setInt(1, 1);
			ResultSet res=pres.executeQuery();
			
			while(res.next()){
				Blob image=res.getBlob(1);                                         //得到该blob
				
				InputStream is = image.getBinaryStream();                          //获得该blob的输出流
                FileOutputStream fos = new FileOutputStream("E:\\outputImage.jpg");  
                int i = 0;  
                while ((i = is.read()) != -1) {  
                    fos.write(i);  
                }  
                fos.flush();  
                fos.close();  
                is.close();  
			}
			System.out.println("成功输出图片!!!");
		} catch (SQLException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值