如果將要檔案寫入資料庫,您可以在欄位上使用
BLOB或CLOB資料型態,
BLOB全名Binary Large Object,用於儲存大量的二進位資料,
CLOB全名Character Large Object,用於儲存大量的文字資料。
在JDBC中也提供了
Blob與Clob兩個類別分別代表BLOB與CLOB資料,JDBC並沒有提供直接存入BLOB或CLOB的對應介面(像是setBlob()、setClob()等),但您可以使用PreparedStatement的
setBinaryStream()、 setObject()、setAsciiStream()、setUnicodeStream()等方法來代替,例如我們可以如下取得一個檔案,並將之存入資料庫中:
// 取得檔案
File file = new File("./logo_phpbb.jpg");
int length = (int) file.length();
InputStream fin = new FileInputStream(file);
// 填入資料庫
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO files VALUES(?, ?)");
pstmt.setString(1, "米小國Logo");
pstmt.setBinaryStream (2, fin, length);
pstmt.executeUpdate();
pstmt.clearParameters();
pstmt.close();
fin.close();
如果要從資料庫中取得BLOB或CLOB資料,您可以如下進行:
Blob blob = result.getBlob(2); // 取得BLOB
Clob clob = result.getClob(2) // 取得CLOB
Blob擁有
getBinaryStream()、getBytes()等方法,可以取得二進位串流或byte等資料,同樣的,Clob擁有
getCharacterStream()、getSubString()等方法,可以取得字元串流或子字串等資料,您可以查看API文件來獲得更詳細的訊息。
下面這個程式示範基本的檔案存入資料庫並取出另存新檔:
BLOBCLOBDemo.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**//**
* @author Administrator
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class BLOBCLOBDemo {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql//localhost:3306/upload?"
+ "useUnicode=true&characterEncoding=gbk";
String user = "root";
String password = "123456";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
File file = new File("./logo_phpbb.jpg");
int length = (int) file.length();
InputStream fin = new FileInputStream(file);
// 存入檔案
PreparedStatement pstmt = conn
.prepareStatement("insert into files values(?, ?)");
pstmt.setString(1, "Logo");
pstmt.setBinaryStream(2, fin, length);
pstmt.executeUpdate();
pstmt.close();
fin.close();
// 取出檔案
Statement stmt = conn.createStatement();
ResultSet result = stmt.executeQuery("select * from files");
result.next();
String description = result.getString(1);
Blob blob = result.getBlob(2);
// 寫入檔案
System.out.println("檔案描述: " + description);
FileOutputStream fout = new FileOutputStream("./logo_phpbb_2.jpg");
fout.write(blob.getBytes(1, (int) blob.length()));
fout.flush();
fout.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("找不到驅動程式");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}