使用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
))!=- 1
){
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
();
}
}
}
}