JDBC 高階資料型別的應用
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- redis-22.高階資料型別Redis資料型別
- Redis 高階資料型別重溫Redis資料型別
- C++/C高階資料型別C++資料型別
- Pandas高階教程之:category資料型別Go資料型別
- 資料型別綜合應用資料型別
- Typescript高階型別TypeScript型別
- Go語言高階資料型別之指標篇Go資料型別指標
- Cats(三):高階型別型別
- redis各資料型別應用概述Redis資料型別
- String資料型別的應用場景資料型別
- sorted set 資料型別的應用場景資料型別
- JDBC 處理CLob和Blob型別資料JDBC型別
- Excel高階應用教程:資料處理與資料分析Excel
- javascript的高階應用JavaScript
- redis資料型別及應用場景Redis資料型別
- Redis 資料型別及應用場景Redis資料型別
- 資料庫開發(21)高階應用開發資料庫
- Oracle資料型別對應Java型別Oracle資料型別Java
- AWK高階應用
- Redis 高階應用Redis
- JDBC與ODBC的區別與應用JDBC
- Redis五種資料型別應用場景Redis資料型別
- redis的五種資料型別及應用場景Redis資料型別
- [轉]ABAP資料型別與Java資料型別的對應關係資料型別Java
- TypeScript筆記(二)高階型別TypeScript筆記型別
- Java中JDBC進階教程之資料庫的隔離級別!JavaJDBC資料庫
- java高階用法之:JNA型別對映應該注意的問題Java型別
- load高階應用
- INSERT高階應用
- javascript高階函式的應用JavaScript函式
- Java 資料型別和 MySql 資料型別對應一覽表JavaMySQL 資料型別
- python中list列表的高階應用 高階函式Python函式
- 【Scala之旅】特質與高階型別型別
- 深入 Python 資料分析:高階技術與實戰應用Python
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- java應用通過jdbc連線資料庫jdbc的串的3種寫法:JavaJDBC資料庫
- 資料型別第2篇「字典和集合的原理和應用」資料型別
- SQL Server 2005 資料型別和.Net資料型別的對應關係SQLServer資料型別