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