1. package book.database;  
  2.  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.sql.Blob;  
  9. import java.sql.Connection;  
  10. import java.sql.PreparedStatement;  
  11. import java.sql.ResultSet;  
  12. import java.sql.SQLException;  
  13. import java.sql.Statement;  
  14.  
  15. /**  
  16.  * 存取BLOB数据到数据库。  
  17.  */ 
  18. public class BlobData {  
  19.     /**  
  20.      * 写Blob数据到数据库  
  21.      * @param con     
  22.      * @param infilePath    保存到数据库的文件     
  23.      */ 
  24.     public static void writeBlob(Connection con, String infilePath){  
  25.         FileInputStream fis = null;  
  26.         PreparedStatement psm = null;  
  27.         try {  
  28.             //打开输入文件  
  29.             File file = new File(infilePath);  
  30.             fis = new FileInputStream(file);  
  31.             psm = con.prepareStatement(  
  32.                     “insert into student_photo(name, filename, filedata)” 
  33.                     + ” values(‘mary’, ?, ?)”);  
  34.             //第一个参数为文件名  
  35.             psm.setString(1, file.getName());  
  36.             //第二个参数为文件的二进制流  
  37.             psm.setBinaryStream(2, fis, fis.available());  
  38.             // 执行  
  39.             psm.executeUpdate();  
  40.         } catch (Exception ex) {  
  41.             ex.printStackTrace();  
  42.         } finally {  
  43.             //关闭打开的对像  
  44.             if (fis != null){  
  45.                 try {  
  46.                     fis.close();  
  47.                 } catch (IOException e) {  
  48.                     e.printStackTrace();  
  49.                 }  
  50.             }  
  51.             OperateDB.closeStatement(psm);  
  52.         }  
  53.     }  
  54.     /**  
  55.      * 从数据库中读Blob数据  
  56.      * @param con  
  57.      * @param srcFileName   要读取的文件名  
  58.      * @param outFilePath   保存到本地的文件  
  59.      */ 
  60.     public static void readBlob(Connection con, String srcFileName,   
  61.             String outFilePath){  
  62.         Statement sm = null;  
  63.         FileOutputStream fos = null;  
  64.         InputStream is = null;  
  65.         try {  
  66.             sm = con.createStatement();  
  67.             ResultSet rs = sm.executeQuery(  
  68.                     “SELECT * FROM student_photo where name = ‘mary'” 
  69.                     + ” and filename = ‘” + srcFileName + “‘”);  
  70.             if (rs.next()) {  
  71.                 // 从列中读取Blob数据  
  72.                 Blob blob = rs.getBlob(“filedata”);  
  73.           
  74.                 // 获取Blob的字节数,是long类型,表示字节数很多。  
  75.                 long blobLength = blob.length();  
  76.                 // 可以通过blob的getBytes方法从Blob对象中提取字节数据  
  77.                 // 也通过Blob对象的二进制输入流读数据  
  78.                 is = blob.getBinaryStream();  
  79.                 byte[] buffer = new byte[4096];  
  80.                 int size;  
  81.                 File file = new File(outFilePath);  
  82.                 try {  
  83.                     fos = new FileOutputStream(file);  
  84.                     while ((size = is.read(buffer)) != –1){  
  85.                         fos.write(buffer, 0, size);  
  86.                     }  
  87.                 } catch (IOException eee) {  
  88.                     eee.printStackTrace();  
  89.                 }  
  90.             }  
  91.             rs.close();  
  92.         } catch (SQLException e) {  
  93.             e.printStackTrace();  
  94.         } finally {  
  95.             OperateDB.closeStatement(sm);  
  96.             if (is != null){  
  97.                 try {  
  98.                     is.close();  
  99.                 } catch (IOException e) {  
  100.                     e.printStackTrace();  
  101.                 }  
  102.             }  
  103.             if (fos != null){  
  104.                 try {  
  105.                     fos.close();  
  106.                 } catch (IOException e) {  
  107.                     e.printStackTrace();  
  108.                 }  
  109.             }  
  110.         }  
  111.     }  
  112.  
  113.     public static void main(String[] args) throws ClassNotFoundException,  
  114.             SQLException {  
  115.         String dbName = “studentdb”;  
  116.         String userName = “test”;  
  117.         String password = “test”;  
  118.           
  119.         Connection con = null;  
  120.         try {  
  121.             // 获得数据库连接  
  122.             con = DBConnector.getMySQLConnection(nullnullnull, dbName,  
  123.                     userName, password);  
  124.             // 写Blob数据  
  125.             BlobData.writeBlob(con, “C:/temp/mary_photo.jpg”);  
  126.             // 读Blob数据  
  127.             BlobData.readBlob(con, “mary_photo.jpg”“C:/temp/mary_photo_db.jpg”);  
  128.         } catch (ClassNotFoundException e1) {  
  129.             throw e1;  
  130.         } catch (SQLException e2) {  
  131.             throw e2;  
  132.         } finally {  
  133.             // 关闭数据库连接  
  134.             OperateDB.closeConnection(con);  
  135.         }  
  136.     }  
  137. }