从JAVA读取BLOB

如果將要檔案寫入資料庫,您可以在欄位上使用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文件來獲得更詳細的訊息。 

下面這個程式示範基本的檔案存入資料庫並取出另存新檔:
import java.io.*;

            import java.sql.*;

            public class DBTest {

            public static void main(String[] args) {

            String driver = "com.mysql.jdbc.Driver";

            String url = "jdbc:mysql://localhost:3306/upload?useUnicode=true&characterEncoding=Big5";

            String user = "caterpillar";

            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.clearParameters();

            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();

            }

            }

            }

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值