長文本(Clob)和二進位檔案(Blob)的處理痛點其實不再JDBC上,而是在輸入輸出上。
package cn.itcast.jdbc;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;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.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;//blob最大64Kpublic class BlobTest { public static void main(String[] args) throws SQLException, IOException {// create(); read(); } // 跟clob差不多,只是修改了Reader為InputStream,並setBinaryStream()設定二進位流 static void create() throws SQLException, IOException { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); String sql = "insert into blob_test(big_bit)values(?)"; ps = conn.prepareStatement(sql); File file = new File("mudan.jpg"); InputStream in = new BufferedInputStream(new FileInputStream(file)); ps.setBinaryStream(1, in, (int) file.length()); // 位元組流 int i = ps.executeUpdate(); in.close(); System.out.println("i=" + i); } finally { JdbcUtils.free(rs, ps, conn); } } static void read() throws SQLException, IOException { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); st = conn.createStatement(); rs = st.executeQuery("select big_bit from blob_test"); while (rs.next()) {// 方法1 // Blob blob = rs.getBlob("1"); // InputStream in = blob.getBinaryStream();// 方法2,這個方法更好 InputStream in=rs.getBinaryStream(1); File file = new File("COPY.jpg"); OutputStream out = new BufferedOutputStream(new FileOutputStream(file)) ; byte[] buff = new byte[1024]; // 緩衝區 for (int i = 0; (i = in.read(buff)) > 0;) out.write(buff, 0, i); out.close(); in.close(); } } finally { JdbcUtils.free(rs, st, conn); } }}