JDBC 2.0 引進了對應於SQL_99的許多新對象,這些新對象有BLOB,CLOB,ARRAY,REF,結構化類型,DISTINCT類型以及LOCATOR.
JDBC 3.0增加了Boolean和Datalink對象
插入這些高級數據類型到數據庫中的主要手段是使用PreparedStatement對象,讀取主要是ResultSet對象.下面介紹怎麼在數據庫中讀取和寫入高級數據類型
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)
作者Blog:http://blog.csdn.Net/sala223/