JDBC 高階資料型別的應用

fsz521job發表於2006-03-22

JDBC 2.0 引進了對應於SQL_99的許多新物件,這些新物件有BLOB,CLOB,ARRAY,REF,結構化型別,DISTINCT型別以及LOCATOR.
JDBC 3.0增加了Boolean和Datalink物件,插入這些高階資料型別到資料庫中的主要手段是使用PreparedStatement物件,讀取主要是ResultSet物件.

下面介紹怎麼在資料庫中讀取和寫入高階資料型別

[@more@]

1:BLOB和CLOB
BLOB: 二進位制大物件(Binary Large OBject)即一個位元組序列(比喻說一個mp3檔案可以儲存為一個BLOB)
CLOB:一個對VARCHAR 或類似的列來說太長的字串.
來自資料庫的BLOB和CLOB資料可以透過java.sql.Blob和java.sql.clob物件來操作.
ResultSet 和PreparedStatement物件提供的處理這兩種資料的方法如下
ResultSet : PreparedStatement
Blob getBlob(int) void setBlob(int ,Blob)//第一個引數是PreparedStatement中的佔位符的索引,以下相同
Blob getBlob(string) void setClob(int ,Clob)
Clob getClob(int)
Clob getClob(String)
使用PreparedStatement.setBlob(int,Blob)我們可以用BLOB資料來設定準備語句中的佔位符,並且可以透過執行SQL語句把這些資料寫入到另一個表中
如:
String sql="select blob_col from blob_table where id=?"//blob_colum ,id為blob_table 這個表的列名
PreparedStatement ps=connection.prepareStatement(sql);
ps.setInt(1,1);
ResultSet rset=ps.executeQuery();
Blob blob=null;
if(rset.next())
{
blob=rset.getBlob(1);
}
上敘中blob只是持有一個指向資料庫中這些二進位制資料的引用.並不持有實際二進位制資料,然後程式碼可以使用這個相同的引用把這些二進位制資料寫入到另外的一個表中:
sql="insert into blob_table_2 values(?)";
ps=connection.prepareStatement(sql);
ps.setBlob(1,blob);
ps.executeUpdate();

jdbc 2.0中的BLOB和CLOB藉口提供了一種從資料庫中獲取資料或寫資料到資料庫的手段,這個手段是透過從資料庫中獲得一個流(輸入或者輸出)物件.並從該流中讀取資料或寫入.
例:
OutputStream out=null;
BufferedInputStream in=null;
File file=new File("****");
ReslutSet rset=statement.executeQuery(sql);//從查詢語句中取得一個結果集
if(rset.next())
{
Blob blob=rset.getBlob(1);
out=((oracle.sql.Blob)blob).getBinaryOutputStream();//jdbc 2.0不支援寫資料到blob,因此我們用Oracle的擴充套件
int bufferSize==((oracle.sql.Blob)blob).getBufferSize();
in=new BufferedInputStream(new fileInputStream(file),bufferSize);
byte[] b=new byte[bufferSize];
int count=in.read(b,0,bufferSize);
//開始儲存資料到資料庫中
while(cout!=-1)
{
out.write(b,o,count);
cout=in.read(b,o,bufferSize);
}
//資料寫完
out.close();
in.close();
connection.commit();//提交改變
........
}
類似的,我們可以從blob中得到一個輸入流,把blob資料寫入到檔案中去
InputStream in=blob.getBinaryStream();
int bufferSize =((oracle.sql.Blob)blob).getBufferSize();
2:結構化資料型別
結構化資料型別類似於一個java物件.如下,我們用SQL定義一個People型別
CREATE OR REPLACE TYPE People AS OBJECT(NAME VARCHAR,AGE INT);//Oracle資料庫..
現在可以在任何地方使用使用PEOPLE該資料型別

CREATE TABLE SAMPLES(SA_ID NUMBER, CURSON People,SAMPLE BLOB);
現在我們可以使用setObject()和 getObject()來操縱這些資料型別
ResultSet : PreparedStatement
Object getObject(int) void getObject(int,Object)
Object getObject(string)
..........
例:public class People implements SQLData,Serializable
{
......
}
Map map=connection.getTypeMap();
map.put("people",People.class);//People這個類必須在前面建立,t它必須為表中的每個列含有一個成員變數
String sql="INSERT INTO SAMPLE(SA_ID,CURSON) VALUES(?,?)";
People people=new People();
ps=connection.prepareStatement(sql);
ps.setInt(1,1);
ps.setObject(2,people);
int result=ps.executeUpdate();
我們也可以從資料庫中取得這個People物件
String sql="SELECT * FROM SAMPLE WHERE SA_ID=1";
ps=connection.prepareStatement(sql);
ResultSet rset=ps.executeQuery();
if(rset.next())
{
People people=(People)rset.getObject(2);
}
3:Distinct 型別
Distinct型別象一個內建型別的別名,我們可以這樣定義這個型別
CREATE TYPE BIRTHDATE AS DATE
由於這個新型別只是一個指向某個已有內建型別的別名,所以我們可以使用getDate()和setDate()的方法;
4:構造型別
Array和Ref object(引用物件)
ResultSet PrepareStatement
Array getArray(int) void setArray(int ,Array)
Array getArray(String)
Ref getRef(int) void setRef(int,Ref)
Ref getRef(String)
Array方法可以透過制定行索引和列索引來存取行值和列值. 該Array物件還可以把陣列做為一個ResultSet來返回.(ResultSet只是存取一組行中的那些列值的手段)
上面我們定義了一個People自定義型別和SAMPLE表.如果執行一個返回People列的查詢,可以使用getRef()的方法,我們將會得到一個指向該列中的那個Prople物件的引用

5:DataLink
JDBC 3.0的一個新功能,DataLink物件描敘外部地存取到資料庫上的資料
DataLink值使用setURL()和getURL()來處理
ResultSet PrepareStatement
URL getURL(int) void setURL(int ,URL)
URL getURL(String)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/300209/viewspace-821945/,如需轉載,請註明出處,否則將追究法律責任。

相關文章