读书人

面试题: 怎么读写Blob类型的数据?lt;详细

发布时间: 2012-08-24 10:00:21 作者: rapoo

面试题: 如何读写Blob类型的数据?<详细解答>
BLOB类型插入数据的设计思路和处理流程

【概述】

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。

写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对

blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor

用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。

【处理流程】

//写Blob数据package demo;import java.sql.*;import oracle.sql.BLOB;//▲此处的BLOB类全大写, 而java.sql.Blob中的Blob非全大写import java.io.*;public class WriteBlob{//加载驱动程序static {try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(Exception e){e.printStackTrace();}}public static void main(String[] args){try{//1. 建立与数据库服务器的连接String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";Connection conn = DriverManager.getConnection(url,"scott","tiger");conn.setAutoCommit(false);//2. 首先向表中插入空的Blob//★注意: 对于empty_blob()应放在SQL语句中直接赋值, 使用预置语句的方式赋值无法实现.String sql = "insert into user_info values(?,?,empty_blob())";PreparedStatement ps = conn.prepareStatement(sql);ps.setInt(1, 1);ps.setString(2, "Lucy");ps.executeUpdate();//3. 查询Blob, 获得Blob的Cursorsql = "select image from user_info where user_id = ?";ps = conn.prepareStatement(sql);ps.setInt(1, 1);ResultSet rs = ps.executeQuery();BLOB blob = null;if(rs.next()){blob = (BLOB)rs.getBlob(1);}//4. 使用字节流将待入库的文件写入到blob中File file = new File("D:\\iriver\\sample1.bmp");FileInputStream fin = new FileInputStream(file);byte[] temp = new byte[fin.available()];fin.read(temp);OutputStream out = blob.getBinaryOutputStream();out.write(temp);fin.close();out.close();//5. 向数据库中写入数据sql = "update user_info set image = ? where user_id = ?";ps = conn.prepareStatement(sql);ps.setBlob(1, blob);ps.setInt(2, 1);ps.executeUpdate();conn.commit();} catch (Exception e){e.printStackTrace();}}}

读书人网 >其他数据库

热点推荐