狂淘

www.kuangtao.net

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  6 随笔 :: 185 文章 :: 68 评论 :: 0 Trackbacks

package eg;  
import java.io.*;  
import java.sql.*;  
public class BlobClobExample {  
 
    public static void main(String[] args) {  
        Connection conn = null;  
        try {  
            conn = JDBCUtils.getConnection(); // 建立连接  
            Statement s = conn.createStatement(); // 创建Statement对象  
            s.executeUpdate("drop table documents");  
            // 这句是为了避免再次创建表documents  
            s  
                    .executeUpdate("CREATE TABLE documents(id INT, text CLOB(64 K) , photo Blob(1440 K))");  
            // 以上就是创建包含Clob和Blob对象的表的过程  
            // 和将一般的字段差不多,后面括号中代表该对象的大小,其语法为:  
            // CLOB (length [{{K |M |G}]) 表示长度为K、M、G等,没有带表示比特  
            conn.commit(); // 提交操作  
            // 以下是将本地文件中,本程序的源文件加载为一个流,用于向数据库中写入Clob字段  
            File file1 = new File("BlobClobExample.java");  
            int len1 = (int) file1.length();  
            InputStream fis1 = new java.io.FileInputStream(file1);  
            // 以下是将当前源代码目录的子目录“11”下的“1.JPG”文件加载为一个流,  
            // 用于后面向数据库中写入Blob字段  
            File file2 = new File("c:\\11\\1.JPG");  
            int len2 = (int) file2.length();  
            InputStream fis2 = new FileInputStream(file2);  
            // 以上两个简单吧!!  
            // 创建一个PreparedStatement对象,用于批量插入内容  
            // 使用PreparedStatement对象可以节省,数据库编译SQL指令的时间,  
            // 因为在使用PreparedStatement对象时,该SQL语句是预先编译好了,  
            // 对于某些变化的参数使用占位符(Place Holder)代替  
            // 这对于以后将要执行多次的同一操作,该操作仅仅是参数不同,是极其有利  
            // 比如在网页上输入客户信息时,用户要填入的数据基本是一样的(你可以填也可以不填)  
            // 这时后台的数据库可以使用PreparedStatement对象,每次都是设置参数,执行操作  
            PreparedStatement ps = conn  
                    .prepareStatement("INSERT INTO documents VALUES (?, ?,?)");  
            ps.setInt(1, 250);  
            ps.setAsciiStream(2, fis1, len1);  
            ps.setBinaryStream(3, fis2, len2);  
            // 以上三步是设置占位符的数值  
            ps.execute(); // 执行操作  
            // 以上四步可以重复执行。PreparedStatement就是为了适用于此用途  
            conn.commit();  
            // 以上完成了数据的写入  
            // 以下是数据的读出  
            ResultSet rs = s  
                    .executeQuery("SELECT text , photo FROM documents WHERE id = 250");  
            while (rs.next()) {  
                Clob aclob = rs.getClob(1); // 和提取一般对象一样  
                InputStream is = rs.getAsciiStream(1); // 特殊的,对于与得到Clob的流  
                // 这是得到Clob、Blob流的第一种方法  
                // 以下是对流进行处理的过程。Clob本身是包含大字符的对象  
                // 顺其自然,以下是使用java IO中读取字符流的方法读取它  
                BufferedReader br = new BufferedReader(  
                        new InputStreamReader(is));  
                String line = null;  
                while (null != (line = br.readLine())) {  
                    System.out.println(line); // 将其输出至屏幕,实际你可以按照需要处理  
                }  
                is.close();  
                java.sql.Blob ablob = rs.getBlob(2); // 和操作其它基本类型的字段一样  
                System.out.println(ablob.length()); // 简单地操作Blob的实例  
                // 实际你可以使用Clob的API对其进行任何它允许的操作,请查API  
                InputStream bis = ablob.getBinaryStream(); // 得到Blob实例的字节流  
                // 这是操作Clob、Blob等对象的第二种方法,也是最自然的用法  
                OutputStream os = new FileOutputStream("11.jpg");  
                // 用于将数据库中的Blob存放到目前目录的“11.jpg”文件中  
                int b = bis.read(); // 以下就是象操作其它java字节流一样操作了  
                while (b != -1) {  
                    os.write((char) b);  
                    b = bis.read();  
                }  
                os.flush();  
                os.close();  
                bis.close();  
            }  
 
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (conn != null)  
                conn.close();  
        }  
 
    }  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangxs_3/archive/2009/03/22/4014308.aspx

posted on 2009-08-25 13:06 狂淘 阅读(930) 评论(0)  编辑  收藏 所属分类: oracle

只有注册用户登录后才能发表评论。


网站导航: