程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 使用PreparedStatement向數據表中插入、修改、刪除、獲取Blob類型的數據,preparedstatement

使用PreparedStatement向數據表中插入、修改、刪除、獲取Blob類型的數據,preparedstatement

編輯:Oracle教程

使用PreparedStatement向數據表中插入、修改、刪除、獲取Blob類型的數據,preparedstatement


使用PreparedStatement向數據表中插入、修改、刪除、獲取Blob類型的數據

2014-09-07 20:17

Blob介紹

BLOB類型的字段用於存儲二進制數據

MySQL中,BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,這幾個類型之間的唯一區別是在存儲文件的最大大小上不同。

MySQL的四種BLOB類型
類型       大小(單位:字節)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

Oracle LOB介紹

    LOB,即Large Objects(大對象),是用來存儲大量的二進制和文本數據的一種數據類型(一個LOB字段可存儲可多達4GB的數據)。
LOB 分為兩種類型:內部LOB和外部LOB。
內部LOB將數據以字節流的形式存儲在數據庫的內部。因而,內部LOB的許多操作都可以參與事務,也可以像處理普通數據一樣對其進行備份和恢復操作。Oracle支持三種類型的內部LOB:
CLOB和NCLOB類型適用於存儲超長的文本數據,BLOB字段適用於存儲大量的二進制數據,如圖像、視頻、音頻,文件等。
目前只支持一種外部LOB類型,即BFILE類型。在數據庫內,該類型僅存儲數據在操作系統中的位置信息,而數據的實體以外部文件的形式存在於操作系統的文件系統中。因而,該類型所表示的數據是只讀的,不參與事務。該類型可幫助用戶管理大量的由外部程序訪問的文件。


程序示例:
package  tan ; import  java .  io .*; import  java .  sql .*; import  java .  text . SimpleDateFormat ; import  org .  junit . Test ; public  class  TestJDBC  {     

    //如何獲取數據表中的 blob類型的變量

    @Test      public  void  testBlob2 ()  {         Connection conn  = null ;         PreparedStatement ps  = null ;         ResultSet rs  = null ;         InputStream is  = null ;         FileOutputStream fos  = null ;           try  {             conn  = JDBCUtils  . getConnection  ();             String sql  = "select id,name,email,birth,photo from customers where id=?" ;             ps  = conn  . prepareStatement  ( sql  );             ps   .setInt  (1 , 16 );//獲取id=16的數據             rs  = ps  . executeQuery  ();               if ( rs . next ()){                   int  id  = rs  . getInt  ( 1 );                 String name  = rs  . getString  ( 2 );                 String email  = rs  . getString  ( 3 );                 Date birth  = rs  . getDate  ( 4 );                 Blob photo   =rs  .getBlob  (5 );                 is  = photo  . getBinaryStream  ();//利用輸入流來讀取數據庫中的二進制文件                 fos  = new  FileOutputStream  ( new  File ( "girl.png" ));//輸出到本地                                    byte  [] buf  = new  byte [  100 ];                   int  len  = 0 ;                   while (( len = is . read ( buf ))!=-){                     fos  . write  ( buf  , 0 ,  len );                   }                 Customer cust  = new  Customer  ( id  ,  name  ,  email ,  birth );//將非blob類型封裝成對象輸出                 System  . out  . println  ( cust  );               }                                     }  catch  ( Exception e  )  {                        } finally {             JDBCUtils  . close  ( rs  ,  ps  ,  conn  );//記得要關閉流               if ( fos  !=  null ){                   try  {                     fos  . close  ();                   }  catch  ( IOException e  )  {                     e  . printStackTrace  ();                   }                                }               if ( is  !=  null ){                   try  {                     is  . close  ();                   }  catch  ( IOException e  )  {                       // TODO Auto-generated catch block                     e  . printStackTrace  ();                   }                                }           }      }     

    // 修改數據表包含圖片信息的數據

    @Test      public  void  testBlob1 ()  {         Connection conn  = null ;         PreparedStatement ps  = null ;         FileInputStream fis  = null ;           try  {             conn  =  JDBCUtils  . getConnection  ();             String sql  =  "update customers set photo = ? where id = ?" ;             ps  =  conn  . prepareStatement  ( sql  );               //  填充占位符             fis  =  new  FileInputStream  ( new  File ( "1.png"  ));             ps   .setBlob  (1 , fis );             ps  . setInt  ( 2 ,  16  );             ps   .execute  ();                        }  catch  ( Exception e  )  {             e  . printStackTrace  ();           } finally {             JDBCUtils  . close  ( null ,  ps ,  conn );               try  {                 fis  . close  ();               }  catch  ( IOException e  )  {                 e  . printStackTrace  ();               }           }               }

    // 向數據表中插入一條包含圖片信息的數據

    @Test      public  void  testBlob ()  {         Connection conn  = null ;         PreparedStatement ps  = null ;         FileInputStream fis  = null ;           try  {             conn  = JDBCUtils  . getConnection  ();             String sql  = "insert into customers(name,email,birth,photo)values(?,?,?,?)" ;             ps  = conn  . prepareStatement  ( sql  );             ps  . setString  ( 1 ,  "  zhengqiang " );             ps  . setString  ( 2 ,  "[email protected]);               // 日期轉換             String date  = "1991-11-13" ;             SimpleDateFormat sdf  = new  SimpleDateFormat ( "yyyy-MM-dd" );             java  . util  . Date d  = sdf  . parse  ( date  );
            ps  . setDate  ( 3 ,  new  Date ( d . getTime ()));
            //利用文件輸入流寫入             fis  = new  FileInputStream  ( new  File ( "66.jpg"  ));             ps  . setBlob  ( 4 ,  fis );               // 執行預編譯語句             ps   .execute  ();                        }  catch  ( Exception e  )  {             e  . printStackTrace  ();           } finally {             JDBCUtils  . close  ( null ,  ps ,  conn );              try  {                 fis  . close  ();               }  catch  ( IOException e  )  {                 e  . printStackTrace  ();               }           }               }      }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved