首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

利用Java向Oracle中安插图片(BLOB)文件

2012-07-28 
利用Java向Oracle中插入图片(BLOB)文件我介绍的是用JDBC的方法进行操作,想用Java来操作Oracle必须(我不知

利用Java向Oracle中插入图片(BLOB)文件

我介绍的是用JDBC的方法进行操作,想用Java来操作Oracle必须(我不知道有没有其他方法)要有classes12.jar(zap),这个东西在网上搜,一搜一大把,如果上不了网,那就去Oracle的安装目录去找吧,举个例子,我的Oracle是10G,classes12.jar的藏身之处就在这里:oracle\product\10.2.0\db_1\jdbc\lib.费话少说,现在来晒晒我的代码.

?

哎?稍等...在晒代码之前还有一个准备工作,那就是建立数据库表啊,呵呵.

建立表和索引(索引有无均可)的脚本如下:

package com.neusoft.test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.apache.tomcat.dbcp.dbcp.ConnectionFactory;public class TestImage {private static Connection conn = null;private Statement stmt = null;private ResultSet rs = null;static {try {// 加载Oracle驱动Class.forName("oracle.jdbc.driver.OracleDriver");// 获得连接conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.225.170:1521:orcl", "scott","tiger");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}/** * 关闭所有与数据库相关的连接 *  * @param conn * @param stmt * @param rs */public void closeAll(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/** * 向数据库中插入图片 */public void inputImage() {try {stmt = conn.createStatement();conn.setAutoCommit(false);// 取消自动提交功能OutputStream os = null;// 插入一个空对象empty_blob()stmt.executeUpdate("insert into t_image (id, image) values (2, empty_blob())");// 锁定数据行进行更新,注意"for update"语句rs = stmt.executeQuery("select image from t_image where id=2 for update");if (rs.next()) {// 得到java.sql.Blob对象后强制转换为oracle.sql.BLOBoracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("image");// 通过getBinaryOutputStream()方法获得向数据库中插入图片的"管道"os = blob.getBinaryOutputStream();// 读取想要存储的图片文件InputStream is = new FileInputStream("E:\\新建文件夹\\6Q52OO3R00DE0005.jpg");// 依次读取流字节,并输出到已定义好的数据库字段中.int i = 0;while ((i = is.read()) != -1) {os.write(i);}}os.flush();os.close();conn.commit();conn.setAutoCommit(true);// 恢复现场} catch (SQLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 关闭相应数据库连接closeAll(rs, stmt, conn);}}/** * 从数据库里检索出图片 */public void outputImage() {try {String sql = "select image from t_image where id=1";stmt = conn.createStatement();rs = stmt.executeQuery(sql);if (rs.next()) {oracle.sql.BLOB b = (oracle.sql.BLOB) rs.getBlob(1);InputStream is = b.getBinaryStream();FileOutputStream fos = new FileOutputStream("E:\\outputImage.jpg");int i = 0;while ((i = is.read()) != -1) {fos.write(i);}fos.flush();fos.close();is.close();}} catch (SQLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {closeAll(rs, stmt, conn);}}public static void main(String[] args) {// 从硬盘提取图片插入到数据库中// new TestImage().inputImage();// 从数据库中检索图片到硬盘new TestImage().outputImage();}}

?注意主函数中被注释掉的方法哦,那个是往数据库里面插入的,嘿嘿....

还有就是不能同时进行插入和检出,因为我的Connection放在了Static中,而每次对数据库操作之后又对其进行了关闭操作,所以inputImage和outputImage不能同时进行,呵呵.

?

以上,谢谢...

热点排行