首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 操縱 SQL Server 2000:透過 JDBC-ODBC 橋接器實現圖片二進制存取

     編輯:Java 相關知識

在早期的 Java 開發環境中,操作 SQL Server 2000 常透過 JDBC-ODBC 橋接器(sun.jdbc.odbc.JdbcOdbcDriver)配合系統 DSN 來完成。本文示範如何將圖片檔案以二進位資料型態(BLOB)寫入資料表,並從資料庫讀取還原成檔案,完整呈現「寫入→讀取」的閉環流程。

核心架構

範例採用兩個類別協作:

  • Db(主程式):組裝 SQL 指令、建立執行緒物件並觸發寫入與讀取。
  • ThreadUseExtends:封裝資料庫連線、二進位串流處理與檔案 I/O,提供 insert() 與 getCover() 兩大核心方法。

寫入圖片(BLOB)

// 1. 載入驅動並取得連線
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:LW");

// 2. 準備 PreparedStatement 與二進位輸入串流
String sql = "INSERT INTO Ss (id, data) VALUES ('0012', ?)";
PreparedStatement stm = con.prepareStatement(sql);
File file = new File("D:\\test1.jpg");
InputStream fin = new FileInputStream(file);
stm.setBinaryStream(1, fin, (int) file.length());

// 3. 執行並關閉資源
stm.execute();
stm.close();
con.close();

關鍵在於 setBinaryStream(int parameterIndex, InputStream x, int length),可直接將檔案串流傳給資料庫,避免將整張圖片載入記憶體再轉 byte[],節省堆疊空間。

讀取並還原圖片

PreparedStatement pst = cn.prepareStatement("SELECT data FROM Ss WHERE ID = '0012'");
ResultSet rs = pst.executeQuery();
while (rs.next()) {
    InputStream in = rs.getBinaryStream("data");
    byte[] buf = new byte[50000];
    int size;
    DataOutputStream output = new DataOutputStream(new FileOutputStream("D:\\test2.jpg"));
    while ((size = in.read(buf, 0, buf.length)) != -1) {
        output.write(buf, 0, size);
    }
    output.close();
}

讀取端同樣採用串流分塊寫入,防止大檔案導致 OOM。實務上建議將緩衝區大小調整為 8KB~64KB,並搭配 try-with-resources 自動關閉資源(JDK 7+)。

現代化遷移建議

  • 棄用 JDBC-ODBC:Java 8 起移除,改用 Microsoft 官方 JDBC 驅動(com.microsoft.sqlserver.jdbc.SQLServerDriver)。
  • 連線池:引入 HikariCP 或 Druid 取代直連,提升併發效能。
  • 參數化查詢:範例已使用 PreparedStatement,可防 SQL Injection,請繼續保持。
  • 大物件處理:SQL Server 2005+ 建議改用 varbinary(max) 搭配 FILESTREAM 或 FileTable,獲得更佳效能與管理彈性。

完整程式碼結構

原始碼包含 Db、ThreadUseExtends 兩個類別,已在上方片段展示關鍵邏輯。完整版本可參考原始輸入內容,包含例外處理、執行緒啟動與資源釋出細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved