konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
如果將要檔案寫入資料庫,您可以在欄位上使用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();
        }

    }

}

posted on 2005-08-10 22:47 konhon 优华 阅读(448) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问