|
8.7. PostgreSQL 对 JDBC API 的扩展PostgreSQL 是一种可扩展的数据库系统. 你可以向数据库后端里增加你自己的函数,这些函数可以供查询调用, 甚至你可以增加你自己的数据类型.因为这些是 PostgreSQL 特有的功能,因此我们在 Java 里面支持它们,同时还带着一套扩展的 API .在标准驱动的核心里实际上使用了这些扩展 来实现大对象等等. 8.7.1. 访问这些扩展要获得某些扩展,你需要使用 org.postgresql.Connection 类里的一些额外的方法,这时,你需要转换 Driver.getConnection() 的返回值.比如∶ Connection db = Driver.getConnection(url, username, password); // ... // later on Fastpath fp = ((org.postgresql.Connection)db).getFastpathAPI();
8.7.1.1. 类 org.postgresql.Connectionpublic class Connection extends Object implements Connection java.lang.Object | +----org.postgresql.Connection 这些是用于获取 PostgreSQL 的扩展 的额外的方法.那些 java.sql.Connection 定义的方法没有列出. 8.7.1.1.1. 方法
8.7.1.2. 类 org.postgresql.Fastpathpublic class Fastpath extends Object java.lang.Object | +----org.postgresql.fastpath.Fastpath Fastpath 是一套存在于 libpq C 接口里的 API , 并且这个接口允许客户机器执行后端数据库的函数. 大多数客户端代码不需要使用这个方法,但是我们还是提供这个方法, 因为大对象 API 使用它. 要使用这个扩展,你需要输入 postgresql.fastpath 包,使用下面行: import org.postgresql.fastpath.*; 然后,在你的代码里,你需要获取一个 FastPath 对象: Fastpath fp = ((org.postgresql.Connection)conn).getFastpathAPI(); 这样将返回一个实例,该实例与你发出命令的数据库联接相关联. 必须把 Connection 转换成 org.postgresql.Connection , 因为 getFastpathAPI() 是我们自己的方法之一,而不是 JDBC 的. 一旦你拥有了 Fastpath 实例, 你就可以使用 fastpath() 方法执行一个后端函数. 又见∶. FastpathFastpathArg , LargeObject 8.7.1.2.1. 方法
8.7.1.3. 类 org.postgresql.fastpath.FastpathArgpublic class FastpathArg extends Object java.lang.Object | +----org.postgresql.fastpath.FastpathArg 每个 fastpath 调用都需要一个参数列表,其数目和类型取决于被调用的函数. 这个类实现了提供这个功能所需要的方法. 关于如何使用这个方法的例子, 参阅 org.postgresql.LargeObject 包 又见∶. Fastpath , LargeObjectManager , LargeObject 8.7.1.3.1. 构造器
8.7.2. 几何数据类型PostgreSQL 有一个往表里存储几何特性的数据类型集. 范围包括点,线,和多边形. 我们通过 org.postgresql.geometric 包在 Java 里支持这些类型. 它包括扩展了 org.postgresql.util.PGobject 类的类. 参考该类获取如何实现你自己的数据类型的控制器的细节. Class org.postgresql.geometric.PGbox java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGbox public class PGbox extends PGobject implements Serializable, Cloneable 这个类在 PostgreSQL 里表示盒子 (box) 数据类型. 变量 public PGpoint point[] 这些是盒子的两个对角点. 构造器 public PGbox(double x1, double y1, double x2, double y2) 参数∶ x1 - 第一个 x 坐标 y1 - 第一个 y 坐标 x2 - 第二个 x 坐标 y2 - 第二个 y 坐标 public PGbox(PGpoint p1, PGpoint p2) 参数∶ p1 - 第一个点 p2 - 第二个点 public PGbox(String s) throws SQLException 参数∶ s - PostgreSQL 语法里的盒子定义 抛出∶ SQLException 如果定义非法 public PGbox() 必须的构造(方法) 方法 public void setValue(String value) throws SQLException 这个方法设置这个对象的值.它应该被重载,但是仍然被子类调用. 参数∶ value - 一个代表对象值的字符串 抛出∶ SQLException 如果此数值对这个类型而言是非法的 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两个盒子相等返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须覆盖这个方法以允许对象被克隆 (cloned) 覆盖∶ 类 PGobject 里的 equals public String getValue() 返回∶ PostgreSQL 句法需要的 PGbox 覆盖∶ getValue in class PGobject Class org.postgresql.geometric.PGcircle java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGcircle public class PGcircle extends PGobject implements Serializable, Cloneable 这个类代表 PostgreSQL 的圆数据类型,由一个点和一个半径组成 变量 public PGpoint center 这是圆心 double radius 这是半径 构造器 public PGcircle(double x, double y, double r) 参数∶ x - 圆心坐标 y - 圆心坐标 r - 圆半径 public PGcircle(PGpoint c, double r) 参数∶ c - 描述圆心的 PGpoint r - 圆半径 public PGcircle(String s) throws SQLException 参数∶ s - PostgreSQL 里语法定义的圆. 抛出∶ SQLException 如果转换失败 public PGcircle() 这个构造(方法)被驱动器使用. 方法 public void setValue(String s) throws SQLException 参数∶ s - 用 PostgreSQL 的语法定义的圆. 抛出∶ SQLException 如果转换失败 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要对比的对象 返回∶ 如果两个圆相同返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须重载这个方法以便允许对象被克隆 (cloned) 覆盖∶ 类 PGobject 里的 clone public String getValue() 返回∶ PostgreSQL 语法里的 PGcircle 字串 覆盖∶ PGobject 里的 getValue Class org.postgresql.geometric.PGline java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGline public class PGline extends PGobject implements Serializable, Cloneable 这个类实现由两个点组成的线.目前线还没有在后端实现, 但这个类保证在后端实现后即可使用(线). 变量 public PGpoint point[] 这是两个点. 构造器 public PGline(double x1, double y1, double x2, double y2) 参数∶ x1 - 第一个点的x坐标 y1 - 第一个点的y坐标 x2 - 第二个点的x坐标 y2 - 第二个点的y坐标 public PGline(PGpoint p1, PGpoint p2) 参数∶ p1 - 第一个点 p2 - 第二个点 public PGline(String s) throws SQLException 参数∶ s - PostgreSQL 语法定义的点. 抛出∶ SQLException 当发生转换错误时 public PGline() 驱动需要 方法 public void setValue(String s) throws SQLException 参数∶ s - PostgreSQL 里语法的线段的定义 抛出∶ SQLException 当发生转换错误时 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两条线段相同返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 这个方法必须被重载以便允许这个对象可以被克隆 覆盖∶ 类 PGobject 里的 clone public String getValue() 返回∶ PostgreSQL 语法里的 PGline 覆盖∶ 类 PGobject 里的 getValue Class org.postgresql.geometric.PGlseg java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGlseg public class PGlseg extends PGobject implements Serializable, Cloneable 这样实现了一条包含两个点的 lseg (线段) 变量 public PGpoint point[] 这里是两个点 构造器 public PGlseg(double x1, double y1, double x2, double y2) 参数∶ x1 - 第一个点的x坐标 y1 - 第一个点的y坐标 x2 - 第二个点的x坐标 y2 - 第二个点的y坐标 public PGlseg(PGpoint p1, PGpoint p2) 参数∶ p1 - 第一个点 p2 - 第二个点 public PGlseg(String s) throws SQLException 参数∶ s - PostgreSQL 里语法对线段定义的字串. 抛出∶ SQLException 在发生转换错误时 public PGlseg() 驱动要求 方法 public void setValue(String s) throws SQLException 参数∶ s - PostgreSQL 里语法对线段定义的字串 抛出∶ SQLException 在发生转换错误时 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两条线段相等 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须覆盖这个方法以便允许这个对象被克隆 覆盖∶ 类 PGobject 里的 getValue public String getValue() 返回∶ PostgreSQL 语法里的 PGlseg 覆盖∶ 类 PGobject 里的 getValue Class org.postgresql.geometric.PGpath java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpath public class PGpath extends PGobject implements Serializable, Cloneable 这是路径( 多线段图形, 可以为封闭的 )的实现 变量 public boolean open 如果路径开放时为真 (True),为封闭时为假 public PGpoint points[] 定义路径的点 构造器 public PGpath(PGpoint points[], boolean open) 参数∶ points - 定义路径的 PGpoints open - 如果路径是开放的为真 (True),封闭为假 (false) public PGpath() 驱动需要 public PGpath(String s) throws SQLException 参数∶ s - PostgreSQL 的语法定义的路径. 抛出∶ SQLException 在发生转换错误时 方法 public void setValue(String s) throws SQLException 参数∶ s - PostgreSQL 的语法定义的路径的字串 抛出∶ SQLException 在发生转换失败时 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两个路径相同返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须覆盖这个方法以便允许这个对象被克隆 覆盖∶ clone in class PGobject public String getValue() 这个方法返回 PostgreSQL 语法的多边形 覆盖∶ 类 PGobject 里的 getValue public boolean isOpen() 如果路径是开放的这个方法返回真 (true) public boolean isClosed() 如果路径是封闭的这个方法返回真 (true) public void closePath() 标记路径为封闭 public void openPath() 标记路径为开放 Class org.postgresql.geometric.PGpoint java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpoint public class PGpoint extends PGobject implements Serializable, Cloneable 这个类实现了 java.awt.Point 的一个版本,但用 double 表示参数. 它对应于 PostgreSQL 里的 point 数据类型. 变量 public double x 点的 X 坐标 public double y 点的 Y 坐标 构造器 public PGpoint(double x, double y) 参数∶ x - 坐标 y - 坐标 public PGpoint(String value) throws SQLException 这个方法主要从其他几何类型调用 -- 当一个点嵌入它们的定义中时. 参数∶ value - PostgreSQL 语法定义的点 public PGpoint() 驱动需要 方法 public void setValue(String s) throws SQLException 参数∶ s - PostgreSQL 语法定义的点 抛出∶ SQLException 在转换失败时 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两个对象相同返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须覆盖这个方法以便允许这个对象被克隆 覆盖∶ 类 PGobject 里的 clone public String getValue() 返回∶ PostgreSQL 里语法 PGpoint 的表示. 覆盖∶ 类 PGobject 里的 getValue public void translate(int x, int y) 对点做指定数量的转换(位移). 参数∶ x - 向 x 轴增加的整型数量 y - 向 y 轴增加的整型数量 public void translate(double x, double y) 对点做指定数量的转换(位移). 参数∶ x - 向 x 轴增加的双精度型数量 y - 向 y 轴增加的双精度型数量 public void move(int x, int y) 把点移到指定坐标. 参数∶ x - 整数坐标 y - 整数坐标 public void move(double x, double y) 把点移到指定坐标. 参数∶ x - 双精度坐标 y - 双精度坐标 public void setLocation(int x, int y) 把点移到指定坐标. 参考 java.awt.Point 获取这个方法的描述信息 参数∶ x - 整数坐标 y - 整数坐标 又见∶ Point public void setLocation(Point p) 把点移到指定坐标. 参考 java.awt.Point 获取这个方法的描述信息 参数∶ p - 移动的目的点 (Point) 又见∶ Point Class org.postgresql.geometric.PGpolygon java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpolygon public class PGpolygon extends PGobject implements Serializable, Cloneable 这个类在 PostgreSQL 里实现了 polygon (多边形)数据类型. 变量 public PGpoint points[] 定义 polygon (多边形)的点 构造器 public PGpolygon(PGpoint points[]) 使用一个 PGpoints 数组创建一个多边形 参数∶ points - 定义多边形 polygon 的点 public PGpolygon(String s) throws SQLException 参数∶ s - 用 PostgreSQL 语法定义的多边形. 抛出∶ SQLException 在转换失败时 public PGpolygon() 驱动需要 方法 public void setValue(String s) throws SQLException 参数∶ s - 用 PostgreSQL 语法定义的多边形. 抛出∶ SQLException 在转换失败时 覆盖∶ 类 PGobject 里的 setValue public boolean equals(Object obj) 参数∶ obj - 要比较的对象 返回∶ 如果两个对象相同返回真 (true) 覆盖∶ 类 PGobject 里的 equals public Object clone() 必须覆盖这个方法以便允许这个对象被克隆 覆盖∶ 类 PGobject 里的 clone public String getValue() 返回∶ PostgreSQL 里语法表示的 PGpolygon. 覆盖∶ 类 PGobject 里的 getValue 8.7.3. 大对象标准的 JDBC 规范里也支持大对象. 但是,那个接口有一些限制, 而 PostgreSQL 提供的 API 允许对对象内容的随机访问, 就象那是一个本地文件一样. org.postgresql.largeobject 包为 Java 提供了 libpq C 接口的大对象 API .它包含两个类, LargeObjectManager , 处理创建,打开和删除大对象的任务;以及 LargeObject ,处理独立的对象. 8.7.3.1. 类 org.postgresql.largeobject.LargeObjectpublic class LargeObject extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObject 这个类实现 PostgreSQL 的大对象接口. 它提供运行接口的基本的方法,另外还有一对方法为此对象提供 InputStream 和 OutputStream 类. 通常,客户端代码将使用在 BLOB 里的方法 访问大对象. 但是,有时候需要低层次的大对象访问方法,那是 JDBC 规范还不支持的. 参考 org.postgresql.largeobject.LargeObjectManager 获取如何访问大对象和如何创建大对象的信息. 又见∶. LargeObjectManager 8.7.3.1.1. 变量
8.7.3.1.2. 方法
8.7.3.2. 类 org.postgresql.largeobject.LargeObjectManagerpublic class LargeObjectManager extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObjectManager 这个类型实现了 PostgreSQL 的大对象接口. 它提供了允许客户代码从数据库里创建,打开和删除大对象的方法. 在打开一个对象时,返回一个 postgresql.largeobject.LargeObject 的实例, 然后它的方法就可以访问该对象. 这个类只能由 org.postgresql.Connection 创建 要访问这个类,使用下面的代码片段: import org.postgresql.largeobject.*; Connection conn; LargeObjectManager lobj; // ... code that opens a connection ... lobj = ((org.postgresql.Connection)myconn).getLargeObjectAPI();
通常, 客户代码要使用 BLOB 方法访问大对象. 但是,有时候需要低层次的大对象访问方法,那是 JDBC 规范还不支持的. 请参考 org.postgresql.largeobject.LargeObject 获取如何控制大对象内容的信息. 8.7.3.2.1. 变量
8.7.3.2.2. 方法
|