国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > PostgreSQL > 正文

PostgreSQL7.0手冊(cè)-接口-58. JDBC 接口

2019-09-08 23:34:10
字體:
供稿:網(wǎng)友
第五十八章. JDBC 接口
內(nèi)容 
制作 JDBC 接口 
為 JDBC準(zhǔn)備數(shù)據(jù)庫 
使用驅(qū)動(dòng) 
裝入 JDBC 
裝載驅(qū)動(dòng) 
與數(shù)據(jù)庫聯(lián)接 
發(fā)出查詢和處理結(jié)果 
執(zhí)行更新 
關(guān)閉聯(lián)接 
使用大對(duì)象 
Postgres 對(duì) JDBC API的擴(kuò)展 
深入閱讀 
作者:由 Peter T. Mount 執(zhí)筆,他是JDBC 驅(qū)動(dòng)的作者.
JDBC 是 Java 1.1 及以后的核心 API.它為 SQL 兼容的數(shù)據(jù)庫提供了一個(gè)標(biāo)準(zhǔn)的接口集合. 
Postgres 提供了類型 4JDBC 驅(qū)動(dòng).類型 4 表明該驅(qū)動(dòng)是用純 Java 書寫的,并且與數(shù)據(jù)庫之間使用數(shù)據(jù)庫自己的網(wǎng)絡(luò)協(xié)議通訊.因此,驅(qū)動(dòng)是平臺(tái)無關(guān)的.一旦編譯,該驅(qū)動(dòng)可以用于任意平臺(tái). 

制作 JDBC 接口
編譯驅(qū)動(dòng)
驅(qū)動(dòng)的源代碼位于源碼樹的 src/interfaces/jdbc 目錄.要編譯之,你只需要進(jìn)入該目錄,然后鍵入: 
% make
編譯完成后,你將在當(dāng)前目錄發(fā)現(xiàn)文件 postgresql.jar.這就是 JDBC 驅(qū)動(dòng). 
  
注意:你必須使用 make,而不是 javac,因?yàn)轵?qū)動(dòng)因?yàn)樾阅茉蚴褂昧艘恍﹦?dòng)態(tài)聯(lián)接技巧,這些是 javac 辦不到的.Makefile 將生成 jar 歸檔文件.
安裝驅(qū)動(dòng)
要使用驅(qū)動(dòng),.jar 文件 postgresql.jar 需要被包含在 CLASSPATH 里. 
例子
我有一個(gè)使用 JDBC 驅(qū)動(dòng)的應(yīng)用,該應(yīng)用訪問一個(gè)包含天文對(duì)象的大數(shù)據(jù)庫.我已經(jīng)有這個(gè)應(yīng)用并且 jdbc 驅(qū)動(dòng)安裝在 /usr/local/lib 目錄,并且 java jdk 安裝在 /usr/local/jdk1.1.6. 
要運(yùn)行應(yīng)用,我可以用: 

export CLASSPATH = /usr/local/lib/finder.jar:/usr/local/lib/postgresql.jar:.
java uk.org.retep.finder.Main
裝載驅(qū)動(dòng)在本章后面部分介紹.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

為 JDBC 準(zhǔn)備數(shù)據(jù)庫
因?yàn)椤ava 只能使用 TCP/IP 聯(lián)接,Postgres 的 postmaster 必須帶 -i 參數(shù)運(yùn)行. 
同樣,必須配置 pg_hba.conf 文件.它放在 PGDATA 目錄.缺省安裝時(shí),這個(gè)文件只允許 UNIX 域套接字訪問.對(duì)聯(lián)到同樣 localhost 的JDBC 驅(qū)動(dòng)(應(yīng)用),你需要加一些象: 

host         all         127.0.0.1     255.255.255.255   password
的東西(到 pg_hba.conf 文件),這里允許從本地 JDBC 對(duì)所有數(shù)據(jù)庫的訪問. 
JDBC 驅(qū)動(dòng)支持 trust,ident,password 和 crypt 認(rèn)證模式.


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

使用驅(qū)動(dòng)
本章并不想作為完整的 JDBC 編程的指導(dǎo),但應(yīng)該能幫你走出第一步.更多信息請(qǐng)參考標(biāo)準(zhǔn) JDBCAPI 文檔.同樣,讀一下包含在源代碼里的例子.其中的基本例子在這里使用.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

裝入 JDBC
任何使用 JDBC 的程序需要輸入 java.sql 包,用: 
import java.sql.*;
關(guān)鍵:不要輸入 postgresql 包.如果這樣做,你的源碼將不能編譯,因?yàn)椤avac 會(huì)被你搞糊涂。

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

裝載驅(qū)動(dòng)
在你試圖與數(shù)據(jù)庫連接之前,你需要裝載驅(qū)動(dòng).有兩種方法,那種更好取決于你使用的代碼. 
在第一種方法里,你的代碼用 Class.forName() 方法顯式裝載驅(qū)動(dòng).對(duì)于 Postgres,你要用: 

Class.forName("postgresql.Driver");
這樣將裝載驅(qū)動(dòng),并且在裝載時(shí),驅(qū)動(dòng)將自動(dòng)與 JDBC 注冊(cè)自己. 
注意:forName() 方法可以拋出一個(gè) ClassNotFoundException,所以如果驅(qū)動(dòng)不可獲得時(shí)你需要捕獲它. 

這是最常用的方法,但是把你的代碼限制于 Postgres 專用.如果你的代碼以后還要訪問其他數(shù)據(jù)庫,并且你不想使用我們的擴(kuò)展,那么第二種方法可用. 

第二種方法把驅(qū)動(dòng)做為參數(shù)在 JVM 啟動(dòng)時(shí)傳遞給它,使用 -D 參數(shù). 

% java -Djdbc.drivers=postgresql.Driver example.ImageViewer
在這個(gè)例子里,JVM 將試圖把驅(qū)動(dòng)作為它的初始化的一部分裝載.一旦完成,啟動(dòng) ImageViewer。 
現(xiàn)在,這個(gè)方法是一個(gè)更好的手段,因?yàn)樗试S你的代碼用于其他數(shù)據(jù)庫,而不用重新編譯代碼.唯一要修改的東西是 URL,我們下面要提到. 

最后一件事情.當(dāng)你的代碼試圖打開一個(gè)聯(lián)接,而且你收到一個(gè)拋出的 No driver available SQLException 例外,這可能是因?yàn)轵?qū)動(dòng)不在 classpath (類路徑)里,或者參數(shù)值不正確.


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

與數(shù)據(jù)庫聯(lián)接
在 JDBC 里,數(shù)據(jù)庫是用 URL (Uniform Resource Locator)(統(tǒng)一資源定位器)表示的.在 Postgres 里,這可以由下面幾種格式之一表示: 
jdbc:postgresql:database 
jdbc:postgresql://host/database 

jdbc:postgresql://hostport/database

這里: 
  
host 
服務(wù)器的主機(jī)名.缺省是 "localhost". 
port 
服務(wù)器監(jiān)聽的端口號(hào).缺省時(shí)是 Postgres 標(biāo)準(zhǔn)的端口號(hào)(5432). 
database 
數(shù)據(jù)庫名. 
要聯(lián)接(數(shù)據(jù)庫),你需要從 JDBC 獲取一個(gè)聯(lián)接實(shí)例(Connection instance).要做這些,你要使用 DriverManager.getConnection() 方法: 
Connection db = DriverManager.getConnection(url,user,pwd);


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

發(fā)出查詢和處理結(jié)果
在任何你想向數(shù)據(jù)庫運(yùn)行一個(gè) SQL 語句的時(shí)候,你都需要一個(gè) Statement (語句)實(shí)例.一旦你擁有了一個(gè) Statement (語句),你就可以使用 executeQuery() 方法來運(yùn)行一個(gè)查詢.這樣將返回一個(gè) ResultSet 實(shí)例,在其內(nèi)部包含整個(gè)結(jié)果. 
使用 Statement (語句)接口
在使用 Statement 接口時(shí)必須考慮下面的問題: 
你可以使用一個(gè) Statement (語句)實(shí)例任意次.你可以在打開一個(gè)聯(lián)接后馬上創(chuàng)建一個(gè) Statement (語句)實(shí)例,并且在聯(lián)接的生存期里使用之.你必須知道每個(gè) Statement 只能存在一個(gè) ResultSet (結(jié)果集). 
如果你需要在處理一個(gè) ResultSet 的時(shí)候執(zhí)行一個(gè)查詢,你只需要?jiǎng)?chuàng)建并且使用另外一個(gè) Statement. 

如果你使用了 Threads (線程),并且有幾個(gè)使用數(shù)據(jù)庫,你對(duì)每個(gè)線程必須使用一個(gè)獨(dú)立的 Statement.如果考慮使用線程,請(qǐng)參考本文檔稍后描述 Threads 和 Servlets 的章節(jié),因?yàn)檫@些內(nèi)容包含一些重要的信息.

使用 ResultSet (結(jié)果集)接口
使用 ResultSet 接口時(shí)必須考慮下面的問題: 
在讀取任何數(shù)值的時(shí)候,你必須調(diào)用 next().如果還有結(jié)果則返回真(true),但更重要的是,它為處理準(zhǔn)備了數(shù)據(jù)行. 
在 JDBC 規(guī)范里,你應(yīng)該對(duì)一個(gè)字段只訪問一次.遵循這個(gè)規(guī)則是安全的,不過目前 Postgres 驅(qū)動(dòng)將允許你對(duì)一個(gè)字段訪問任意次. 

一旦你結(jié)束對(duì)一個(gè) ResultSet 的處理,你必須調(diào)用對(duì)之 close()。 

一旦你使用那個(gè)創(chuàng)建 ResultSet 的 Statement 做另一個(gè)查詢請(qǐng)求,當(dāng)前打開的實(shí)例將被關(guān)閉.

下面是一個(gè)例子: 
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("select * from mytable");
while(rs.next()) {
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

執(zhí)行更新
要執(zhí)行一次更新 (或任何其他不返回結(jié)果的 SQL 語句),你只需要使用 executeUpdate() 方法: 
st.executeUpdate("create table basic (a int2, b int2)");

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

關(guān)閉聯(lián)接
要關(guān)閉數(shù)據(jù)庫聯(lián)接,只需要對(duì)聯(lián)接調(diào)用 close() 方法: 
db.close();

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

使用大對(duì)象
在 Postgres 里,大對(duì)象(也稱之為 液滴(blobs) )用于保存那些無法在通常 SQL 表里面保存的數(shù)據(jù).它們是通過表/索引對(duì)進(jìn)行存儲(chǔ)的,然后用一個(gè) OID 值從你自己的表里面引用. 
關(guān)鍵:對(duì)于 Postgres,你必須在一個(gè) SQL 事務(wù)里面訪問大對(duì)象。盡管我們總是這樣要求,但直到版本 6.5 我們才嚴(yán)格要求這樣做。你應(yīng)該帶著一個(gè)輸入?yún)?shù) false 使用 setAutoCommit() 方法打開一個(gè)事務(wù): 
Connection mycon;
...
mycon.setAutoCommit(false);
... now use Large Objects
現(xiàn)在,你有幾種使用大對(duì)象的方法.第一種是標(biāo)準(zhǔn)的 JDBC 方式,這個(gè)方式在這里有文檔.另一種,使用我們對(duì)該(JDBC)api (編程接口)的擴(kuò)展,也是一種用于 Java 的 libpq 大對(duì)象 API 的形式,提供了一種比標(biāo)準(zhǔn)方法更好的訪問大對(duì)象的訪問方法.在系統(tǒng)內(nèi)部,該驅(qū)動(dòng)使用這種擴(kuò)展來提供大對(duì)象支持. 
在JDBC里,標(biāo)準(zhǔn)的訪問大對(duì)象的方法是使用 ResultSet 里的 getBinaryStream() 方法,和PreparedStatement 里的 setBinaryStream() 方法.這些方法把大對(duì)象表示成 Java 的流(stream),允許你用 java.io 和其他的包來操縱這些對(duì)象. 

例如,假設(shè)你有一個(gè)包含一幅圖象文件名的表,而且一個(gè)大對(duì)象包含這個(gè)圖象: 

create table images (imgname name,imgoid oid);
要插入一幅圖象,你可以: 
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("insert into images values (?,?)");
ps.setString(1,file.getName());
ps.setBinaryStream(2,fis,file.length());
ps.executeUpdate();
ps.close();
fis.close();
現(xiàn)在,在這個(gè)例子里,setBinaryStream 從一個(gè)流里面把一定字節(jié)的數(shù)據(jù)轉(zhuǎn)換到大對(duì)象里,然后把(大對(duì)象的) OID 存儲(chǔ)到引用它的字段里. 
檢索一幅圖象甚至更快(我在這里使用 PreparedStatement ,當(dāng)然用 Statement 也是一樣的): 

PreparedStatement ps = con.prepareStatement("select oid from images where name=?");
ps.setString(1,"myimage.gif");
ResultSet rs = ps.executeQuery();
if(rs!=null) {
    while(rs.next()) {
        InputStream is = rs.getBinaryInputStream(1);
        // use the stream in some way here
        is.close();
    }
    rs.close();
}
ps.close();
這里你可以看到這里大對(duì)象是當(dāng)做一個(gè) InputStream (輸入流)檢索的.你還會(huì)注意到我們?cè)谔幚斫Y(jié)果的下一行之前關(guān)閉了流.這是 JDBC 規(guī)范的一部分,該規(guī)范指出任何返回的 InputStream 在調(diào)用 ResultSet.next() 或 ResultSet.close() 后都要被關(guān)閉.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

Postgres 對(duì) JDBC API的擴(kuò)展
Postgres 是一種可擴(kuò)展的數(shù)據(jù)庫系統(tǒng).你可以向數(shù)據(jù)庫后端里增加你自己的函數(shù),這些函數(shù)可以供查詢調(diào)用,甚至你可以增加你自己的數(shù)據(jù)類型. 
因?yàn)槟壳斑@些特性是我們獨(dú)有的,所以我們?cè)凇ava 里通過一套擴(kuò)展的 API 提供對(duì)這些特性的支持.在標(biāo)準(zhǔn)驅(qū)動(dòng)的核心里有些特性實(shí)際上是通過這些擴(kuò)展實(shí)現(xiàn)的,比如大對(duì)象等. 

獲得這些擴(kuò)展

要獲得某些擴(kuò)展,你需要使用 postgresql.Connection 類里的一些額外的方法
這時(shí),你需要轉(zhuǎn)換  Driver.getConnection() 的返回值.

例如:

    Connection db = Driver.getConnection(url,user,pass);

    // later on
    Fastpath fp = ((postgresql.Connection)db).getFastpathAPI();

Class postgresql.Connection
                                
java.lang.Object
   |
   +----postgresql.Connection

   公共類 (public class) Connection 擴(kuò)展了(類) Object 實(shí)現(xiàn)的 Connection

這些是用于獲取我們的擴(kuò)展的額外方法.我
沒有列出由 java.sql.Connection 定義的方法.

 public Fastpath getFastpathAPI() throws SQLException

          這里返回當(dāng)前聯(lián)接的 Fastpath API.

          注意:這個(gè)用法不是 JDBC 的一部分,但是允許使用 postgresql 后端本身的函數(shù).

          這個(gè)用法基本上是用于 LargeObject API 的

          使用這個(gè)用法的最好的方法是:

 import postgresql.fastpath.*;
 ...
 Fastpath fp = ((postgresql.Connection)myconn).getFastpathAPI();

           這里 myconn 是一個(gè)打開了的到 postgresql 的 Connection (聯(lián)接).

        返回:
                Fastpath 對(duì)象允許使用在 postgresql 后端上的函數(shù).

        拋出: SQLException
                在 Fastpath 為第一次使用初始化時(shí)生成
          
 public LargeObjectManager getLargeObjectAPI() throws SQLException

          這個(gè)語句為當(dāng)前聯(lián)接返回 LargeObject API.

          注意:這個(gè)用法不是 JDBC 的一部分,但是允許使用 postgresql 后端本身的函數(shù).
   
          使用這個(gè)用法的最好的方法是:

 import postgresql.largeobject.*;
 ...
 LargeObjectManager lo = 
((postgresql.Connection)myconn).getLargeObjectAPI();

          這里 myconn 是一個(gè)打開了的到 postgresql 的 Connection (聯(lián)接).

        返回:
                實(shí)現(xiàn)該 API 的 LargeObject 對(duì)象

        拋出: SQLException
                在 LargeObject 為第一次使用初始化時(shí)生成

 public void addDataType(String type,
                         String name)

          這個(gè)函數(shù)允許客戶應(yīng)用代碼為 postgresql 眾多獨(dú)立數(shù)據(jù)類型的一個(gè)增加一個(gè)控制器.
通常,驅(qū)動(dòng)器不能識(shí)別的數(shù)據(jù)類型由 ResultSet.getObject() 做為 PGobject 實(shí)例返回.

這個(gè)方法允許你寫一個(gè)類擴(kuò)展 PGobject,并且 
告訴驅(qū)動(dòng)器要使用的類型名稱和類名稱.

這樣做的不便之處是你每次進(jìn)行聯(lián)接后都必須調(diào)用這個(gè)方法.

          注意:這個(gè)用法不是 JDBC 的一部分, 而是一個(gè)擴(kuò)展.

          使用這個(gè)用法的最好方法是:

 ...
 ((postgresql.Connection)myconn).addDataType("mytype","my.class.name"-
);
 ...

          這里 myconn 是一個(gè)打開了的與 postgresql 的 Connection (聯(lián)接).

          該控制類必須擴(kuò)展 postgresql.util.PGobject

        參閱:
                PGobject

Fastpath

Fastpath 是一套存在于libpq C 接口里的API,并且這個(gè)接口允許客戶機(jī)器執(zhí)行后端數(shù)據(jù)庫的函數(shù).
大多數(shù)客戶端代碼不需要使用這個(gè)方法,但是我們還是提供這個(gè)方法,因?yàn)榇髮?duì)象 API 使用它.

要使用這個(gè)特性,你需要輸入 postgresql.fastpath 包,使用下面行
     import postgresql.fastpath.*;

然后,在你的代碼里,你需要獲取一個(gè) FastPath 對(duì)象:
     Fastpath fp = ((postgresql.Connection)conn).getFastpathAPI();

這樣將返回一個(gè)實(shí)例,該實(shí)例與你用來執(zhí)行命令的數(shù)據(jù)庫聯(lián)接相關(guān)聯(lián).
把 Connection 轉(zhuǎn)換成 postgresql.Connection 是必須的,因?yàn)椤etFastpathAPI() 是我們自己的
方法之一,而不是 JDBC 的.

一旦你有一個(gè) Fastpath 實(shí)例,你就可以使用 fastpath() 方法來執(zhí)行后端函數(shù).

Class postgresql.fastpath.Fastpath

java.lang.Object
   |
   +----postgresql.fastpath.Fastpath

   公共類 (public class) Fastpath

   擴(kuò)展了 Object

   這個(gè)類實(shí)現(xiàn)了 Fastpath api (編程接口).

   這是在一個(gè) java 應(yīng)用里執(zhí)行內(nèi)嵌在 postgresql 后端的函數(shù)的方法.

   這個(gè)方法是以文件 src/interfaces/libpq/fe-exec.c 為基礎(chǔ)的

   參閱:
          FastpathFastpathArg, LargeObject

方法

 public Object fastpath(int fnid,
                        boolean resulttype,
                        FastpathArg args[]) throws SQLException

          向 PostgreSQL 后端發(fā)送一個(gè)函數(shù)調(diào)用
          
        參數(shù):
                fnid - 函數(shù) id
                resulttype - 如果結(jié)果是整數(shù)返回真 (true), 其他結(jié)果返回假 (false)
                args - 傳遞給 fastpath 的參數(shù) FastpathArguments 

        返回:
                如果沒有數(shù)據(jù)返回空(null), 如果結(jié)果為整數(shù)返回一個(gè)Integer, 否則返回 byte[]
         
        拋出: SQLException
                如果發(fā)生了一個(gè)數(shù)據(jù)庫訪問錯(cuò)誤.

 public Object fastpath(String name,
                        boolean resulttype,
                        FastpathArg args[]) throws SQLException


         通過名稱向 PostgreSQL 后端發(fā)送一個(gè)函數(shù)調(diào)用.

注意:
         函數(shù)名到函數(shù) id 的影射必須存在, 通常先調(diào)用 addfunction(). 這是調(diào)用函數(shù)的比較好的方法,
因?yàn)楹瘮?shù) id 在不同版本的后端里是會(huì)/可能改變的. 獲取這個(gè)方法工作的例子, 參閱 postgresql.LargeObject

        參數(shù):
                name - 函數(shù)名稱
                resulttype - 如果結(jié)果是整數(shù)返回真 (true), 其他結(jié)果返回假 (false)
                args - 傳遞給 fastpath 的參數(shù) FastpathArguments

        返回:
                如果沒有數(shù)據(jù)返回空 (null), 如果結(jié)果為整數(shù)返回一個(gè) Integer, 否則返回 byte[]

        拋出: SQLException
                如果名稱未知或者數(shù)據(jù)庫訪問錯(cuò)誤發(fā)生.

        參閱:
                LargeObject
          
 public int getInteger(String name,
                       FastpathArg args[]) throws SQLException

          這個(gè)便利方法假設(shè)返回值是一個(gè) Integer (整數(shù))

        參數(shù):
                name - 函數(shù)名
                args - 函數(shù)參數(shù)
     返回:
                整數(shù)結(jié)果

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤或者沒有結(jié)果

 public byte[] getData(String name,
                       FastpathArg args[]) throws SQLException

          這個(gè)便利方法假設(shè)返回值是二進(jìn)制數(shù)據(jù)

        參數(shù):
                name - 函數(shù)名
                args - 函數(shù)參數(shù)

        返回:
                包含結(jié)果的 byte[] 數(shù)組

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤或者沒有結(jié)果

 public void addFunction(String name,
                         int fnid)

          這個(gè)方法向我們的(函數(shù))檢索表里增加一個(gè)函數(shù).

          用戶代碼應(yīng)該使用 addFunctions 方法, 因?yàn)檫@個(gè)方法基于一個(gè)查詢,而不是難寫的 oid 代碼.
我們不保證一個(gè)函數(shù)的 oid 是靜態(tài)的, 甚至運(yùn)行在不同服務(wù)器的同版本的數(shù)據(jù)庫也不能保證是統(tǒng)一的.

        參數(shù):
                name - 函數(shù)名
                fnid - 函數(shù) id

 public void addFunctions(ResultSet rs) throws SQLException
                       
          這個(gè)方法接收一個(gè)包含兩個(gè)字段的 ResultSet. 字段 1 包含函數(shù)名, 字段 2 是 oid.

          它讀取整個(gè) ResultSet, 把值裝載入函數(shù)表.

          調(diào)用完這個(gè)方法后記得用 close() 關(guān)閉結(jié)果集!!

          關(guān)于函數(shù)名查找實(shí)現(xiàn)的信息:
          
          PostgreSQL 在 pg_proc 表里存儲(chǔ)函數(shù) id 和它們對(duì)應(yīng)的名稱, 在
查找時(shí)不是從該表里查詢每個(gè)所需函數(shù)的名稱, 而是使用了一個(gè) Hashtable (散列表).
同樣, 只有需要的函數(shù)的名稱才放到這個(gè)表里, 以保證連接速度盡可能快.

          postgresql.LargeObject 類在啟動(dòng)時(shí)執(zhí)行一個(gè)查詢, 并且把返回的
 ResultSet 傳遞給這里提到的 addFunctions() 方法
       
          一旦這些工作完成, LargeObject api 用名稱引用函數(shù).
          
          不要以為手工把它們轉(zhuǎn)換成 oid 可以工作. 的確, 目前這樣做是可以用的, 但隨著開發(fā)的
過程這些可能被修改(在 V7.0 版本的討論中有一些關(guān)于這些的話題), 所以這樣做是防止未來將出現(xiàn)的
任何沒有保證的痛苦的手段.

        參數(shù):
                rs - ResultSet

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤.
          
        參閱:
                LargeObjectManager

 public int getID(String name) throws SQLException
          
          這個(gè)方法返回與函數(shù)名關(guān)聯(lián)的函數(shù) id
          
          如果還沒有對(duì)這個(gè)函數(shù)調(diào)用 addFunction() 或 addFunctions(), 那么拋出一個(gè) SQLException .

        參數(shù):
                name - 待查找的函數(shù)名

        返回:
                用于 fastpath 調(diào)用的函數(shù) ID

        拋出: SQLException
                如果函數(shù)未知.

Class postgresql.fastpath.FastpathArg

java.lang.Object
   |
   +----postgresql.fastpath.FastpathArg

   public class FastpathArg extends Object
        
   每個(gè) fastpath 調(diào)用需要一個(gè)參數(shù)列表, 其數(shù)目和類型取決于被調(diào)用的函數(shù).

   這個(gè)類實(shí)現(xiàn)了提供這個(gè)功能所需要的方法.

   關(guān)于如何使用這個(gè)方法的例子, 參閱postgresql.largeobject 包

   參閱:
          Fastpath, LargeObjectManager, LargeObject

構(gòu)造(方法)

 public FastpathArg(int value)
 
          構(gòu)造一個(gè)包含一個(gè)整數(shù)的參數(shù)

        參數(shù):
                value - 待設(shè)置的 int (整數(shù))值

 public FastpathArg(byte bytes[])
          
          構(gòu)造一個(gè)包含一些字節(jié)的數(shù)組的參數(shù)

        參數(shù):
                bytes - 要保存的數(shù)組
 public FastpathArg(byte buf[],
                    int off,
                    int len)

           構(gòu)造一個(gè)包含一個(gè)數(shù)組的一部分的參數(shù)

        參數(shù):
                buf - 源數(shù)組
                off - 數(shù)組內(nèi)的偏移量
                len - 要包括的數(shù)據(jù)的長(zhǎng)度

 public FastpathArg(String s)
          
          構(gòu)造一個(gè)包含一個(gè)字符串的參數(shù).
      
        參數(shù):
                s - 要保存的字符串

幾何數(shù)據(jù)類型

PostgreSQL 有一個(gè)往表里存儲(chǔ)幾何特性的數(shù)據(jù)類型集.范圍包括點(diǎn), 線, 和多邊形.

我們通過 postgresql.geometric 包來在 Java 里支持這些類型.

它包括擴(kuò)展 postgresql.util.PGobject 類的類.參考該類獲取如何實(shí)現(xiàn)你自己的數(shù)據(jù)類型的控制器的細(xì)節(jié).

Class postgresql.geometric.PGbox

java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGbox

   公共類 PGbox 擴(kuò)展 PGobject 實(shí)現(xiàn) Serializable, Cloneable

   這個(gè)類在 postgresql 里表示盒子 (box) 數(shù)據(jù)類型.

變量 (Variables)

 public PGpoint point[]

          這些是盒子的兩個(gè)對(duì)角點(diǎn).

構(gòu)造(方法)

 public PGbox(double x1,
              double y1,
              double x2,
              double y2)

        參數(shù):
                x1 - 第一個(gè) x 坐標(biāo)
                y1 - 第一個(gè) y 坐標(biāo)
                x2 - 第二個(gè) x 坐標(biāo)
                y2 - 第二個(gè) y 坐標(biāo)

 public PGbox(PGpoint p1,
              PGpoint p2)

        參數(shù):
                p1 - 第一個(gè)點(diǎn)
                p2 - 第二個(gè)點(diǎn)

 public PGbox(String s) throws SQLException
                            
        參數(shù):
                s - PostgreSQL 語法里的盒子定義

        拋出: SQLException
                如果定義非法
 public PGbox()

          必須的構(gòu)造(方法)
              
方法

 public void setValue(String value) throws SQLException
                
          這個(gè)方法設(shè)置這個(gè)對(duì)象的值. 它應(yīng)該被重載, 但是仍然被子類調(diào)用.
                            
        參數(shù):
                value - 一個(gè)代表對(duì)象值的字符串
        拋出: SQLException
                如果此數(shù)值對(duì)這個(gè)類型而言是非法的

        重載:
                類 PGobject 里的 setValue

 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象
                
        返回:
                如果兩個(gè)盒子相等返回真 (true)
          
        重載:
                類 PGobject 里的 equals

 public Object clone()
        
          必須重載這個(gè)方法以允許對(duì)象被克隆 (cloned)

        重載:
                類 PGobject 里的 clone 
   
 public String getValue()
        
        返回:
                postgresql 需要的 PGbox 句法字串

        重載:
                PGobject 里的 getValue 
Class postgresql.geometric.PGcircle

java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGcircle
        
       
   公共類 PGcircle 擴(kuò)展 PGobject 實(shí)現(xiàn)的 Serializable, Cloneable
               
   這個(gè)類代表 postgresql 的圓數(shù)據(jù)類型, 由一個(gè)點(diǎn)和一個(gè)半徑組成

變量

 public PGpoint center
           
          這是圓心
 
public double radius
           
           這是半徑
   
構(gòu)造(方法)

 public PGcircle(double x,
                 double y,
                 double r)
          
        參數(shù):
               x - 圓心坐標(biāo)
                y - 圓心坐標(biāo)
                r - 圓半徑

 public PGcircle(PGpoint c,
                 double r)
          
        參數(shù):
                c - PGpoint 描述圓心
                r - 圓半徑

 public PGcircle(String s) throws SQLException

        參數(shù):
                s -  PostgreSQL 里語法定義的圓.

        拋出: SQLException
                如果轉(zhuǎn)換失敗

 public PGcircle()

          這個(gè)構(gòu)造(方法)被驅(qū)動(dòng)器使用.
            
方法   

 public void setValue(String s) throws SQLException

         參數(shù):
                s - 用 PostgreSQL 的語法定義的圓.

        拋出: SQLException
                如果轉(zhuǎn)換失敗

        重載:
                類PGobject 里的 setValue 

 public boolean equals(Object obj)

        參數(shù):
                obj - 要對(duì)比的對(duì)象
            
        返回:
                如果兩個(gè)圓相同返回真 (true)

        重載:
                類 PGobject 里的 equals 

 public Object clone()

          必須重載這個(gè)方法以便允許對(duì)象被克隆 (cloned)

        重載:
                類 PGobject 里的 clone 

 public String getValue()

        返回:
                postgresql 語法需要的 PGcircle 字串
        
        重載:
                PGobject 里的 getValue 

Class postgresql.geometric.PGline

java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGline

   公共類 PGline 擴(kuò)展 PGobject 實(shí)現(xiàn)的 Serializable, Cloneable

   這個(gè)類實(shí)現(xiàn)由兩個(gè)點(diǎn)組成的線. 目前線還沒有在后端實(shí)現(xiàn),但這個(gè)類保證在后端實(shí)現(xiàn)后即可使用(線).

變量
   
 public PGpoint point[]
     
          這是兩個(gè)點(diǎn).

構(gòu)造(方法)

 public PGline(double x1,
               double y1,
               double x2,
               double y2)

        參數(shù):
                x1 - 第一個(gè)點(diǎn)的坐標(biāo)
                y1 - 第一個(gè)點(diǎn)的坐標(biāo)
                x2 - 第二個(gè)點(diǎn)的坐標(biāo)
                y2 - 第二個(gè)點(diǎn)的坐標(biāo)

 public PGline(PGpoint p1,
               PGpoint p2)
     
        參數(shù):
                p1 - 第一個(gè)點(diǎn)
                p2 - 第二個(gè)點(diǎn)

 public PGline(String s) throws SQLException
               
       參數(shù):
                s - PostgreSQL 語法定義的點(diǎn).

        拋出: SQLException
                當(dāng)發(fā)生轉(zhuǎn)換錯(cuò)誤時(shí)
 public PGline()

    驅(qū)動(dòng)需要
               
方法

 public void setValue(String s) throws SQLException

        參數(shù):
                s -  PostgreSQL 里語法的線段的定義

        拋出: SQLException
                當(dāng)發(fā)生轉(zhuǎn)換錯(cuò)誤時(shí)

        重載:
                類 PGobject 里的 setValue 
                
 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象
               
        返回:
                如果兩條線段相同返回真 (true)
   
        重載:
                類 PGobject 里的 equals 

 public Object clone()
        
           這個(gè)方法必須被重載以便允許這個(gè)對(duì)象可以被克隆

        重載:
                類 PGobject 里的 clone 

 public String getValue()
   
       返回:
                postgresql 語法要求的 PGline 字串
        
        重載:
                類 PGobject 里的 getValue 
Class postgresql.geometric.PGlseg
             
java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGlseg
          
   公共類 PGlseg 擴(kuò)展 PGobject 實(shí)現(xiàn)的 Serializable, Cloneable
 
   這個(gè)實(shí)現(xiàn)是一條包含兩個(gè)點(diǎn)的 lseg (線段)

變量

 public PGpoint point[]
           
         這里是兩個(gè)點(diǎn)

構(gòu)造(方法)
   
 public PGlseg(double x1,
               double y1,
               double x2,
               double y2)
     
        參數(shù):

                x1 - 第一個(gè)點(diǎn)的坐標(biāo)
                y1 - 第一個(gè)點(diǎn)的坐標(biāo)
                x2 - 第二個(gè)點(diǎn)的坐標(biāo)
                y2 - 第二個(gè)點(diǎn)的坐標(biāo)

 public PGlseg(PGpoint p1,
               PGpoint p2)
           
        參數(shù):
                p1 - 第一個(gè)點(diǎn)
                p2 - 第二個(gè)點(diǎn)
   
 public PGlseg(String s) throws SQLException

        參數(shù):
                s -  PostgreSQL 里語法對(duì)線段定義的字串.

        拋出: SQLException
                在發(fā)生轉(zhuǎn)換錯(cuò)誤時(shí)

 public PGlseg()

          驅(qū)動(dòng)要求
               
方法    
   
 public void setValue(String s) throws SQLException
   
        參數(shù):
                s -  PostgreSQL 里語法對(duì)線段定義的字串 

        拋出: SQLException
                在發(fā)生轉(zhuǎn)換錯(cuò)誤時(shí)
     
        重載:
                類 PGobject 里的 setValue 
                
 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象
               
        返回:
                如果兩條線段相等
   
        重載:
                類 PGobject 里的 equals
   
 public Object clone()

          必須重載這個(gè)方法以便允許這個(gè)對(duì)象被克隆

        重載:
               類 PGobject 里的 clone

 public String getValue()

        返回:
                postgresql 語法要求的 PGlseg 字串
        
        重載:
                類 PGobject 里的 getValue

Class postgresql.geometric.PGpath
                                
java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGpath
          
   公共類 PGpath 擴(kuò)展 PGobject 實(shí)現(xiàn) Serializable, Cloneable
               
   這是路徑( 多線段圖形, 可以為封閉的 )的實(shí)現(xiàn)
           
變量

 public boolean open
               
          如果路徑開放時(shí)為真 (True), 為封閉時(shí)為假

 public PGpoint points[]

          定義路徑的點(diǎn)

構(gòu)造(方法)   

 public PGpath(PGpoint points[],
               boolean open)
          
        參數(shù):
                points - 定義路徑的 PGpoints
                open - 如果路徑是開放的為真 (True), 封閉為假 (false)

 public PGpath()

          驅(qū)動(dòng)需要

 public PGpath(String s) throws SQLException

        參數(shù):
                s - PostgreSQL 的語法定義的路徑的字串.

        拋出: SQLException
                在發(fā)生轉(zhuǎn)換錯(cuò)誤時(shí)

方法

 public void setValue(String s) throws SQLException
   
        參數(shù):
                s - PostgreSQL 的語法定義的路徑的字串
           
        拋出: SQLException
                在發(fā)生轉(zhuǎn)換失敗時(shí)

        重載:
                類 PGobject 里的 setValue

 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象

        返回:
                如果兩個(gè)路徑相同返回真 (true)

        重載:
                類 PGobject 里的 equals

 public Object clone()

          必須重載這個(gè)方法以便允許這個(gè)對(duì)象被克隆

        重載:
                類 PGobject 里的 clone

 public String getValue()

          這個(gè)方法返回 postgresql 語法的多邊形字串

        重載:
                類 PGobject 里的 getValue

 public boolean isOpen()

     如果路徑是開放的這個(gè)方法返回真 (true)

 public boolean isClosed()

     如果路徑是封閉的這個(gè)方法返回真 (true)

 public void closePath()

     標(biāo)記路徑為封閉

 public void openPath()

     標(biāo)記路徑為開放

Class postgresql.geometric.PGpoint
                                
java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGpoint
          
   公共類 PGpoint 擴(kuò)展 PGobject 實(shí)現(xiàn) Serializable, Cloneable

   這個(gè)類實(shí)現(xiàn)了 java.awt.Point 的一個(gè)版本, 但用 double 表示參數(shù).

   它對(duì)應(yīng)于 postgresql 里的 point 數(shù)據(jù)類型.

變量

 public double x

          點(diǎn)的 X 坐標(biāo)

 public double y

          點(diǎn)的 Y 坐標(biāo)

構(gòu)造(方法)

 public PGpoint(double x,
                double y)

        參數(shù):
                x - 坐標(biāo)
                y - 坐標(biāo)

 public PGpoint(String value) throws SQLException
     
          這個(gè)方法主要從其他集合類型調(diào)用 -- 當(dāng)一個(gè)點(diǎn)嵌入它們的定義中時(shí).
             
        參數(shù):
                value - PostgreSQL 語法定義的點(diǎn)
   
 public PGpoint()
          
          驅(qū)動(dòng)需要

方法

 public void setValue(String s) throws SQLException

        參數(shù):
                s - PostgreSQL 語法定義的點(diǎn)

        拋出: SQLException
                在轉(zhuǎn)換失敗時(shí)

        重載:
                類 PGobject 里的 setValue
          
 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象

        返回:
                如果兩個(gè)對(duì)象相同返回真 (true)

        重載:
                類 PGobject 里的 equals

 public Object clone()
                
          必須重載這個(gè)方法以便允許這個(gè)對(duì)象被克隆

        重載:
                類 PGobject 里的 clone
          
 public String getValue()       
    
        返回:
                postgresql 期望的語法的 PGpoint 的表示字串.

        重載:
                類 PGobject 里的 getValue
          
 public void translate(int x,
                       int y)

          對(duì)點(diǎn)做指定數(shù)量的轉(zhuǎn)換(位移).

        參數(shù):
                x - 向 x 軸增加的整型數(shù)量
                y - 向 y 軸增加的整型數(shù)量

 public void translate(double x,
                       double y)
          
          對(duì)點(diǎn)做指定數(shù)量的轉(zhuǎn)換(位移).
 
        參數(shù):
                x - 向 x 軸增加的雙精度型數(shù)量
                y - 向 y 軸增加的雙精度型數(shù)量

 public void move(int x,
                  int y)
                
          把點(diǎn)移到指定坐標(biāo).

        參數(shù):
                x - 整數(shù)坐標(biāo)
                y - 整數(shù)坐標(biāo)

public void move(double x,
                  double y)
          
          把點(diǎn)移到指定坐標(biāo).

        參數(shù):
                x - 雙精度坐標(biāo)
                y - 雙精度坐標(biāo)

 public void setLocation(int x,
                         int y)

          把點(diǎn)移到指定坐標(biāo). 參考
          java.awt.Point 獲取這個(gè)方法的描述信息

        參數(shù):
                x - 整數(shù)坐標(biāo)
                y - 整數(shù)坐標(biāo)

        參閱:
                Point

 public void setLocation(Point p)

        把點(diǎn)移到指定坐標(biāo). 參考
          java.awt.Point 獲取這個(gè)方法的描述信息
         
        參數(shù):
                p - 移動(dòng)的目的點(diǎn) (Point)

        參閱:
                Point

Class postgresql.geometric.PGpolygon
                                
java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.geometric.PGpolygon

   公共類 PGpolygon 擴(kuò)展 PGobject 實(shí)現(xiàn) Serializable, Cloneable
               
   這個(gè)類在 PostgreSQL 里實(shí)現(xiàn)了 polygon (多邊形)數(shù)據(jù)類型.

變量

 public PGpoint points[]

          定義 polygon (多邊形)的點(diǎn)
                                
構(gòu)造(方法)

 public PGpolygon(PGpoint points[])

          使用一個(gè) PGpoints 數(shù)組創(chuàng)建一個(gè)多邊形

        參數(shù):
                points - 定義多邊形 polygon 的點(diǎn)

 public PGpolygon(String s) throws SQLException
                 
        參數(shù):
                s - 用 PostgreSQL 語法定義的多邊形.

        拋出: SQLException
                在轉(zhuǎn)換失敗時(shí)

 public PGpolygon()

          驅(qū)動(dòng)需要

方法

 public void setValue(String s) throws SQLException

        參數(shù):
                s - 用 PostgreSQL 語法定義的多邊形.

        拋出: SQLException
                在轉(zhuǎn)換失敗時(shí)

        重載:
                類 PGobject 里的 setValue

 public boolean equals(Object obj)
     
        參數(shù):
                obj - 要比較的對(duì)象
                                
        返回:
                如果兩個(gè)對(duì)象相同返回真 (true)

        重載:
                類 PGobject 里的 equals

 public Object clone()
        
          必須重載這個(gè)方法以便允許這個(gè)對(duì)象被克隆

        重載:
                類 PGobject 里的 clone
                 
 public String getValue()

        返回:
                postgresql 期望的語法表示的 PGpolygon 字串.

        重載:
                類 PGobject 里的 getValue

大對(duì)象

標(biāo)準(zhǔn)的 JDBC 規(guī)范里也支持大對(duì)象. 但是, 那個(gè)接口有限制, 而 PostgreSQL 提供的 api
允許對(duì)對(duì)象內(nèi)容的隨機(jī)訪問, 就象那是一個(gè)本地文件一樣.

postgresql.largeobject 包為 Java 提供了 libpq C 接口的大對(duì)象 API. 它包含兩個(gè)類, 
LargeObjectManager, 處理創(chuàng)建, 打開和刪除大對(duì)象的任務(wù), 以及 LargeObject, 處理獨(dú)立的對(duì)象.

Class postgresql.largeobject.LargeObject

java.lang.Object
   |
   +----postgresql.largeobject.LargeObject

公共類 LargeObject 擴(kuò)展 Object

這個(gè)類實(shí)現(xiàn) postgresql 的大對(duì)象接口.

   它提供運(yùn)行接口的基本的方法, 另外還有一對(duì)方法為此對(duì)象提供 InputStream 和 OutputStream 類.

   通常, 客戶代碼將在 ResultSet 里使用 getAsciiStream, getBinaryStream, 
或 getUnicodeStream 方法, 或在訪問大對(duì)象 PreparedStatement 時(shí)用
setAsciiStream, setBinaryStream, 或 setUnicodeStream 方法.

   但是, 有時(shí)候需要低層次的大對(duì)象訪問方法,那是 JDBC 規(guī)范還不支持的.

   參考 postgresql.largeobject.LargeObjectManager 獲取如何訪問大對(duì)象和如何創(chuàng)建大對(duì)象的信息.

   參閱:
          LargeObjectManager

變量

 public static final int SEEK_SET

          標(biāo)識(shí)從一個(gè)文件的開頭進(jìn)行一次搜索

 public static final int SEEK_CUR

          標(biāo)識(shí)從當(dāng)前位置進(jìn)行一次搜索

 public static final int SEEK_END

          標(biāo)識(shí)從一個(gè)文件的結(jié)尾進(jìn)行一次搜索

方法

 public int getOID()

        返回:
                此大對(duì)象的 OID 

 public void close() throws SQLException

          這個(gè)方法關(guān)閉對(duì)象. 在調(diào)用這個(gè)方法后你不能調(diào)用這個(gè)對(duì)象里的任何方法.

    拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public byte[] read(int len) throws SQLException

          從對(duì)象讀取一些數(shù)據(jù), 并且做為 byte[] 數(shù)組返回

        參數(shù):
                len - 讀取的字節(jié)數(shù)

        返回:
                包含讀取數(shù)據(jù)的 byte[] 數(shù)組

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public void read(byte buf[],
                  int off,
                  int len) throws SQLException

          從對(duì)象讀取一些數(shù)據(jù)到現(xiàn)有數(shù)組

        參數(shù):
                buf - 目的數(shù)組
                off - 數(shù)組內(nèi)偏移量
                len - 讀取的字節(jié)數(shù)

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public void write(byte buf[]) throws SQLException

          向?qū)ο罄飳懭胍粋€(gè)數(shù)組


        參數(shù):
                buf - 待寫數(shù)組

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public void write(byte buf[],
                   int off,
                   int len) throws SQLException

          從數(shù)組里寫一些數(shù)據(jù)到對(duì)象

        參數(shù):
                buf - 目標(biāo)數(shù)組
                off - 數(shù)組內(nèi)偏移量
                len - 寫入字節(jié)數(shù)

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public void seek(int pos,
                  int ref) throws SQLException

          在對(duì)象內(nèi)部設(shè)置當(dāng)前位置.

          這個(gè)類似于標(biāo)準(zhǔn) C 庫里的 fseek() 調(diào)用它允許你對(duì)大對(duì)象進(jìn)行隨機(jī)訪問.

        參數(shù):
                pos - 對(duì)象內(nèi)部的位置
                ref - 可以是 SEEK_SET, SEEK_CUR 或 SEEK_END
        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public void seek(int pos) throws SQLException

          在對(duì)象內(nèi)部設(shè)置當(dāng)前位置.

          這個(gè)類似于標(biāo)準(zhǔn) C 庫里的 fseek() 調(diào)用它允許你對(duì)大對(duì)象進(jìn)行隨機(jī)訪問.

        參數(shù):
                pos - 對(duì)象內(nèi)部相對(duì)開頭的位置

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public int tell() throws SQLException

        返回:
                對(duì)象內(nèi)部當(dāng)前位置

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public int size() throws SQLException

          這個(gè)方法不夠高效, 因?yàn)檎页鲆粋€(gè)對(duì)象的唯一方法是搜索到結(jié)尾, 記錄當(dāng)前位置,然后返回到初始位置.

          今后要找出一個(gè)更好的方法.

        返回:
                大對(duì)象的尺寸

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public InputStream getInputStream() throws SQLException

          從對(duì)象返回一個(gè) InputStream.

          然后這個(gè) InputStream 就可以用于任何需要一個(gè) InputStream 的方法里.

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

 public OutputStream getOutputStream() throws SQLException

          返回一個(gè)這個(gè)對(duì)象的 OutputStream

          然后這個(gè) OutputStream 就可以用于任何需要一個(gè) OutputStream 的方法里.

        拋出: SQLException
                如果發(fā)生了數(shù)據(jù)庫訪問錯(cuò)誤

Class postgresql.largeobject.LargeObjectManager
                                
java.lang.Object
   |
   +----postgresql.largeobject.LargeObjectManager

公共類 LargeObjectManager 擴(kuò)展 Object

這個(gè)類型實(shí)現(xiàn) postgresql 的大對(duì)象接口.
        
   它提供了允許客戶代碼從數(shù)據(jù)庫里創(chuàng)建, 打開和刪除大對(duì)象的方法.在打開一個(gè)對(duì)象時(shí), 返回一個(gè)
postgresql.largeobject.LargeObject 的實(shí)例, 并且它的方法允許訪問該對(duì)象.

這個(gè)類只能由 postgresql.Connection 創(chuàng)建

要訪問這個(gè)類, 使用下面的代碼片段:

 import postgresql.largeobject.*;
 Connection  conn;
 LargeObjectManager lobj;
 ... code that opens a connection ...
 lobj = ((postgresql.Connection)myconn).getLargeObjectAPI();

通常, 客戶代碼會(huì)在 ResultSet 里使用 getAsciiStream, getBinaryStream, 
或 getUnicodeStream 方法, 或在訪問大對(duì)象的 PreparedStatement 里使用 setAsciiStream, 
setBinaryStream, 或 setUnicodeStream 方法.

   但是, 有時(shí)候需要低層次的大對(duì)象訪問方法,那是 JDBC 規(guī)范還不支持的.

   請(qǐng)參考 postgresql.largeobject.LargeObject 獲取如何控制大對(duì)象內(nèi)容的信息.

   參閱:
          LargeObject

變量

 public static final int WRITE

          這個(gè)模式表明我們要寫入大對(duì)象

 public static final int READ

          這個(gè)模式表明我們要讀取大對(duì)象

 public static final int READWRITE

          這個(gè)模式是缺省的, 表明我們要對(duì)大對(duì)象進(jìn)行讀和寫的操作

方法

 public LargeObject open(int oid) throws SQLException
          
          這個(gè)方法打開一個(gè)現(xiàn)有的大對(duì)象, 以其 OID 為基礎(chǔ). 這個(gè)方法假設(shè)
          我們需要 READ 和 WRITE 訪問模式 (缺省模式).

        參數(shù):
                oid - 大對(duì)象標(biāo)識(shí) (oid)

        返回:
                提供訪問大對(duì)象的方法的 LargeObject 實(shí)例

        拋出: SQLException
                出錯(cuò)時(shí)

 public LargeObject open(int oid,
                         int mode) throws SQLException
          
          這個(gè)方法打開一個(gè)現(xiàn)有的大對(duì)象, 以其 OID 為基礎(chǔ).
  
        參數(shù):
                oid - 大對(duì)象標(biāo)識(shí) (oid)
                mode - 打開模式

        返回:
                提供訪問大對(duì)象的方法的 LargeObject 實(shí)例

        拋出: SQLException
                出錯(cuò)時(shí)

 public int create() throws SQLException

          這個(gè)方法創(chuàng)建一個(gè)大對(duì)象, 返回它的 OID.

          它把新創(chuàng)建的大對(duì)象模式設(shè)為缺省的 READWRITE .

        返回:
                新對(duì)象的 oid (對(duì)象標(biāo)識(shí))

        拋出: SQLException
                出錯(cuò)時(shí)

 public int create(int mode) throws SQLException

          這個(gè)方法創(chuàng)建一個(gè)大對(duì)象, 返回它的 OID.

        參數(shù):
                mode - 一個(gè)描述新對(duì)象不同屬性的位掩碼

        返回:
                新對(duì)象的 oid (對(duì)象標(biāo)識(shí))

        拋出: SQLException
                出錯(cuò)時(shí)

 public void delete(int oid) throws SQLException
          
          這個(gè)方法刪除一個(gè)大對(duì)象.
          
        參數(shù):
                oid - 描述要?jiǎng)h除的對(duì)象

        拋出: SQLException
                出錯(cuò)時(shí)

 public void unlink(int oid) throws SQLException

          這個(gè)方法刪除一個(gè)大對(duì)象.

          這個(gè)方法等同于 delete 方法, 并且作為類似使用 unlink 的
C API 出現(xiàn).

        參數(shù):
                oid - 描述要?jiǎng)h除的對(duì)象

        拋出: SQLException
                出錯(cuò)時(shí)

對(duì)象的串行化 (Object Serialisation)PostgreSQL 不是通常的 SQL 數(shù)據(jù)庫. 它比其他數(shù)據(jù)庫有更強(qiáng)的可擴(kuò)展性,
并且支持面向?qū)ο蟮奶匦? 這一點(diǎn)另 postgresql 非常獨(dú)特.

這些特性的一個(gè)結(jié)果就是你可以擁有一個(gè)引用其他表的行的表, 例如:

test=> create table users (username name,fullname text);
CREATE
test=> create table server (servername name,adminuser users);
CREATE
test=> insert into users values ('peter','Peter Mount');
INSERT 2610132 1
test=> insert into server values ('maidast',2610132::users);
INSERT 2610133 1
test=> select * from users;
username|fullname      
--------+--------------
peter   |Peter Mount   
(1 row)

test=> select * from server;
servername|adminuser
----------+---------
maidast   |  2610132
(1 row)

好, 上面的例子表明我們可以把一個(gè)表當(dāng)作字段來用,并且該行的 oid 值保存在該字段里.

那么這些與 Java 有什么關(guān)系呢?

在 Java 里, 只要一個(gè)對(duì)象的類實(shí)現(xiàn)了 java.io.Serializable 接口, 你就可以把一個(gè)對(duì)象存儲(chǔ)成一個(gè)
 Stream (流). 這個(gè)過程稱為對(duì)象串行化 (Object Serialization), 可以用于將復(fù)雜的對(duì)象存入數(shù)據(jù)庫.

現(xiàn)在, 在 JDBC 里, 你將不得不使用一個(gè) LargeObject 來存儲(chǔ)它們.不過, 你不能在這些對(duì)象上執(zhí)行查詢.

postgresql.util.Serialize 類做的工作就是提供一個(gè)把一個(gè)對(duì)象存儲(chǔ)為表的方法,
并且從一個(gè)表中檢索出該對(duì)象. 大多數(shù)情況下, 你將不需要直接訪問這個(gè)類,
但是你要用到 PreparedStatement.setObject() 和 
ResultSet.getObject() 方法. 這些方法將對(duì)照數(shù)據(jù)庫里的表檢查對(duì)象類的名稱,
如果找到一個(gè)匹配的, 它就假設(shè)該對(duì)象是一個(gè)串行化了的對(duì)象
然后從該表中檢索出對(duì)象來. 在這么做的同時(shí), 如果該對(duì)象包含其他串行化對(duì)象
那么它遞歸地檢索這個(gè)嵌套樹.

聽起來很復(fù)雜? 實(shí)際上, 它比我寫的要簡(jiǎn)單 - 只是解釋起來困難些.

你可能訪問這個(gè)類的唯一機(jī)會(huì)是使用 create() 方法. 這些不會(huì)被驅(qū)動(dòng)使用, 只是對(duì)數(shù)據(jù)庫執(zhí)行一條或更多條
"create table" 語句 - 以你想要串行化的表或 Java 對(duì)象為基礎(chǔ).

哦, 最后一件事情. 如果你的對(duì)象包含象這樣的一行:

     public int oid;

那么, 當(dāng)對(duì)象從表里檢索出來時(shí), 它被設(shè)置為表里的 oid. 
那么, 如果該對(duì)象被修改, 然后重新串行化, 那么現(xiàn)有的記錄將被更新.

如果不存在 oid 變量, 那么當(dāng)對(duì)象串行化時(shí), 它總是被插入表中, 而任何現(xiàn)存的記錄將保留.

在串行化之前把 oid 設(shè)為 0 將同樣導(dǎo)致對(duì)象被插入.這樣就使在表中復(fù)制對(duì)象成為可能.

Class postgresql.util.Serialize

java.lang.Object
   |
   +----postgresql.util.Serialize

   公共類 Serialize 擴(kuò)展 Object

   這個(gè)類使用 PostgreSQL 的面向?qū)ο蟮奶匦源鎯?chǔ) Java 對(duì)象. 
它通過把 Java Class 的名稱映射到一個(gè)數(shù)據(jù)庫里的表實(shí)現(xiàn)這一點(diǎn).
這樣, 這個(gè)新表里的每條記錄都代表一個(gè)這個(gè)類的串行化了的實(shí)例.
因?yàn)槊織l記錄都有一個(gè) OID (Object IDentifier 對(duì)象標(biāo)識(shí)), 
這個(gè) OID 可以被包含在其他表里. 在這里演示實(shí)在是太復(fù)雜了, 將在主文檔里記錄更多的細(xì)節(jié).

構(gòu)造(方法)

 public Serialize(Connection c,
                  String type) throws SQLException

          這個(gè)方法創(chuàng)建一個(gè)可以用于從一個(gè) PostgreSQL 表里串行化一個(gè) Java 對(duì)象的實(shí)例.

方法

 public Object fetch(int oid) throws SQLException

          這個(gè)方法通過給出的 OID 從一個(gè)表里抓取一個(gè)對(duì)象.

        參數(shù):
                oid - 對(duì)象的 oid (對(duì)象標(biāo)識(shí))

        返回:
                與 oid 相關(guān)的 Object (對(duì)象)

        拋出: SQLException
                出錯(cuò)時(shí)

 public int store(Object o) throws SQLException

          這個(gè)方法把一個(gè)對(duì)象存入一個(gè)表中, 返回它的 OID.

          如果對(duì)象有一個(gè) int (整數(shù))叫 OID, 并且 > 0, 那么那個(gè)值
用于 OID, 并且表將被更新. 如果 OID 的值是 0, 那么將創(chuàng)建一個(gè)新行, 而且
OID 的值將被設(shè)置在對(duì)象里(對(duì)象必須實(shí)現(xiàn)串行化). 這樣就使一個(gè)對(duì)象在數(shù)據(jù)庫里的值被更新成為可能.
如果對(duì)象沒有名為 OID 的 int (整數(shù)), 那么對(duì)象被存儲(chǔ). 不過, 如果對(duì)象隨后被檢索, 改動(dòng)并且重新
存儲(chǔ), 那么它的新狀態(tài)將被附加到表上, 并且將不覆蓋原來的記錄.

        參數(shù):
                o - 待存儲(chǔ)的 Object 對(duì)象 (必須實(shí)現(xiàn)串行化)

        返回:
                存儲(chǔ)了的對(duì)象的 oid 

        拋出: SQLException
                出錯(cuò)時(shí)
 
 public static void create(Connection con,
                           Object o) throws SQLException

          這個(gè)方法不被驅(qū)動(dòng)使用, 但是它創(chuàng)建一個(gè)表, 給出一個(gè)可串行化的 Java 對(duì)象. 
應(yīng)該在串行化任何對(duì)象之前使用它.

        參數(shù):
                c - 與數(shù)據(jù)庫的 Connection (聯(lián)接)
                o - 表所依賴的 Object (對(duì)象)

        拋出: SQLException
                出錯(cuò)時(shí)

        返回:
                與 Object (對(duì)象)相關(guān)的 oid

        拋出: SQLException
                出錯(cuò)時(shí)

 public int store(Object o) throws SQLException

          這個(gè)方法存儲(chǔ)一個(gè)對(duì)象到表里面, 返回對(duì)象的 OID.

          如果對(duì)象有一個(gè) int (整數(shù))叫 OID, 并且 > 0, 那么那個(gè)值
用于 OID, 并且表將被更新. 如果 OID 的值是 0, 那么將創(chuàng)建一個(gè)新行, 而且
OID 的值將被設(shè)置在對(duì)象里. 這樣就使一個(gè)對(duì)象在數(shù)據(jù)庫里的值被更新成為可能.
如果對(duì)象沒有名為 OID 的 int (整數(shù)), 那么對(duì)象被存儲(chǔ). 不過, 如果對(duì)象隨后被檢索, 改動(dòng)并且重新
存儲(chǔ), 那么它的新狀態(tài)將被附加到表上, 并且將不覆蓋原來的記錄.

        參數(shù):
                o - 要存儲(chǔ)的 Object (對(duì)象) (必須實(shí)現(xiàn)串行化)

        返回:
                存儲(chǔ)了的對(duì)象的 oid 

        拋出: SQLException
                出錯(cuò)時(shí)
 
 public static void create(Connection con,
                           Object o) throws SQLException

          這個(gè)方法不被驅(qū)動(dòng)使用, 但是它創(chuàng)建一個(gè)表, 給出一個(gè)可串行化的 Java 對(duì)象. 
應(yīng)該在串行化任何對(duì)象之前使用它.

        參數(shù):
                c - 與數(shù)據(jù)庫的 Connection (聯(lián)接)
                o - 表所依賴的 Object (對(duì)象)

        拋出: SQLException
                出錯(cuò)時(shí)
                
 public static void create(Connection con,
                           Class c) throws SQLException

          這個(gè)方法不被驅(qū)動(dòng)使用, 但是它創(chuàng)建一個(gè)表, 給出一個(gè)可串行化的 Java 對(duì)象. 
應(yīng)該在串行化任何對(duì)象之前使用它.

        參數(shù):
                c - 與數(shù)據(jù)庫的 Connection (聯(lián)接)
                o - 表所依賴的 Object (對(duì)象)

        拋出: SQLException
                出錯(cuò)時(shí)

 public static String toPostgreSQL(String name) throws SQLException
          
          這個(gè)方法把一個(gè) Java 類名稱轉(zhuǎn)換成一個(gè) postgresql 表, 通過
          把 . 替換成 _

          因?yàn)檫@個(gè)原因, 一個(gè)類的名稱不能包含 _ .

          另外一個(gè)限制, 是整個(gè)表名 (包括
          包名) 不能長(zhǎng)于 31 個(gè)字符 (一個(gè)源于 PostgreSQL 的限制 ).

        參數(shù):
                name - 類名稱

        返回:
                PostgreSQL 表名稱

        拋出: SQLException
                出錯(cuò)時(shí)
          
 public static String toClassName(String name) throws SQLException

          這個(gè)方法把一個(gè) postgresql 表轉(zhuǎn)換成一個(gè) Java 類名稱, 通過把 _  替換成 .

        參數(shù):
                name - PostgreSQL 表名稱
  
        返回:
                類名稱

        拋出: SQLException
                出錯(cuò)時(shí)

工具類

postgresql.util 包包含被主驅(qū)動(dòng)內(nèi)部使用的類以及其他擴(kuò)展.

Class postgresql.util.PGmoney
                                
java.lang.Object
   |
   +----postgresql.util.PGobject
           |
           +----postgresql.util.PGmoney

   公共類 PGmoney 擴(kuò)展 PGobject 實(shí)現(xiàn) Serializable, Cloneable
               
   這個(gè)類實(shí)現(xiàn)一個(gè)操縱 PostgreSQL money (貨幣)類型的類

變量

 public double val
                                
          字段的值

構(gòu)造(方法)
           
 public PGmoney(double value)
   
        參數(shù):
                value - 字段值
               
 public PGmoney(String value) throws SQLException
   
          這個(gè)方法主要是被從其他類型里面調(diào)用 -- 當(dāng)貨幣被嵌入到那些類型的定義里面的時(shí)候.

        參數(shù):
                value - PostgreSQL 的語法定義的貨幣字串

 public PGmoney()

          驅(qū)動(dòng)需要

方法

 public void setValue(String s) throws SQLException

        參數(shù):
                obj - 要比較的對(duì)象
                                
        返回:
                如果兩個(gè)對(duì)象相同返回真 (true)

        重載:
                類 PGobject 里的 equals

 public boolean equals(Object obj)

        參數(shù):
                obj - 要比較的對(duì)象
                                
        返回:
                如果兩個(gè)對(duì)象相同返回真 (true)

        重載:
                類 PGobject 里的 equals

 public Object clone()
                
          必須重載這個(gè)方法以便允許這個(gè)對(duì)象被克隆

        重載:
                類 PGobject 里的 clone
 public String getValue()

        返回:
                postgresql 希望的貨幣?
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 安宁市| 司法| 通渭县| 高雄市| 沈阳市| 维西| 合川市| 黎城县| 土默特左旗| 绥江县| 芦山县| 林州市| 庄河市| 凭祥市| 岑溪市| 临清市| 扶余县| 壤塘县| 榆社县| 六枝特区| 海伦市| 大关县| 景洪市| 叙永县| 环江| 通榆县| 九江市| 济宁市| 天等县| 犍为县| 苍南县| 宣汉县| 离岛区| 清涧县| 达州市| 治多县| 连云港市| 铁力市| 揭东县| 策勒县| 景宁|