命名的行的 Java™ 类必须实现 SQLData 接口。对于命名的行中每一元素,该类必须有一
个成员,但除了这些之外可有其他成员。这些成员可以按任何顺序,且不要公开。
对于命名的行,Java 类必须实现 writeSQL()、readSQL() 和 getSQLTypeName() 方法,如
在 SQLData 接口中定义的那样,但可实现附加的方法。可使用 ClassGenerator 实用程序来
创建该类;要获取更多信息,请参阅 ClassGenerator 实用程序。
要以命名的行来链接此 Java 类,请使用 Connection.setTypeMap() 方法或 getObject() 方法,
来创建定制的类型映射。要获取关于类型映射的更多信息,请参阅 映射数据类型。
不可使用 SQLData 接口来访问未命名的行。
SQLData 示例
本部分中所有示例的完整版本位于安装了驱动程序处的 demo/complex-types 目录中。要获
取更多信息,请参阅 示例代码文件。
下列示例包括一个实现 java.sql.SQLData 接口的 Java™ 类。
这里是样例数据库模式:
CREATE ROW TYPE fullname_t (first char(20), last char(20));
CREATE ROW TYPE person_t (id int, name fullname_t, age int);
CREATE TABLE teachers (person person_t, dept char (20));
INSERT INTO teachers VALUES ("row(100, row('Bill', 'Smith'), 27)",
"physics");
这是 fullname Java 类:
import java.sql.*;
public class fullname implements SQLData
GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 125
-
{
public String first;
public String last;
private String sql_type = "fullname_t";
public String getSQLTypeName()
{
return sql_type;
}
public void readSQL (SQLInput stream, String type) throws
SQLException
{
sql_type = type;
first = stream.readString();
last = stream.readString();
}
public void writeSQL (SQLOutput stream) throws SQLException
{
stream.writeString(first);
stream.writeString(last);
}
/*
* Function not required by SQLData interface, but makes
* it easier for displaying results.
*/
public String toString()
{
String s = "fullname: ";
s += "first: " + first + " last: " + last;
return s;
}
}
这是 person Java 类:
import java.sql.*;
public class person implements SQLData
{
public int id;
GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 126
-
public fullname name;
public int age;
private String sql_type = "person_t";
public String getSQLTypeName()
{
return sql_type;
}
public void readSQL (SQLInput stream, String type) throws SQLException
{
sql_type = type;
id = stream.readInt();
name = (fullname)stream.readObject();
age = stream.readInt();
}
public void writeSQL (SQLOutput stream) throws SQLException
{
stream.writeInt(id);
stream.writeObject(name);
stream.writeInt(age);
}
public String toString()
{
String s = "person:";
s += "id: " + id + "\n";
s += " name: " + name.toString() + "\n";
s += " age: " + age + "\n";
return s;
}
}
这里是访存命名的行的示例:
java.util.Map map = conn.getTypeMap();
conn.setTypeMap(map);
map.put("fullname_t", Class.forName("fullname"));
map.put("person_t", Class.forName("person"));
...
GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 127
-
PreparedStatement pstmt;
ResultSet rs;
pstmt = conn.prepareStatement("select person from teachers");
System.out.println("prepare ...ok");
rs = pstmt.executeQuery();
System.out.println("executetQuery()...ok");
while (rs.next())
{
person who = (person) rs.getObject(1);
System.out.println("getObject()...ok");
System.out.println("Data fetched:");
System.out.println("row: " + who.toString());
}
pstmt.close();
通过 Connection 对象,conn.getTypeMap() 方法从 java.util.Map 对象返回命名的行映射信
息。
map.put() 方法注册数据库服务器上嵌套的命名的行 fullname_t 与 Java 类 fullname 之间
的映射,以及数据库服务器上命名的行 person_t 与 Java 类 person 之间的映射。
person who = (person) rs.getObject(1) 语句将命名的行检索至 Java 对象 who 内。GBase 8s
JDBC Driver 承认此对象 who 是命名的行、distinct 类型或 opaque 类型,因为数据库服务
器发送的信息有扩展的名称 person_t。
驱动程序查找 person_t,
并发现它是命名的行。
驱动程序以键 person_t 调用 map.get() 方法,
其返回 person 类对象。实例化类 person 的一个对象。
person 类中的 readSQL() 方法调用定义在 SQLInput 接口中的方法,来将 ROW 列中每一
字段转换为 Java 对象,并将每一指定为 person 类中的一个成员。
下列展示一个方法,用于使用 setObject() 方法将 Java 对象插入至命名的行列内:
java.util.Map map = conn.getTypeMap();
map.put("fullname_t", Class.forName("fullname"));
map.put("person_t", Class.forName("person"));
...
PreparedStatement pstmt;
System.out.println("Populate person and fullname objects");
person who = new person();
fullname name = new fullname();
GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 128
-
name.last = "Jones";
name.first = "Sarah";
who.id = 567;
who.name = name;
who.age = 17;
String s = "insert into teachers values (?, 'physics')";
pstmt = conn.prepareStatement (s);
System.out.println("prepared...ok");
pstmt.setObject(1, who);
System.out.println("setObject()...ok");
int rowcount = pstmt.executeUpdate();
System.out.println("executeUpdate()...ok");
pstmt.close();
通过 Connection 对象,conn.getTypeMap() 方法从 java.util.Map 对象返回命名的行映射信
息。
map.put() 方法注册数据库服务器上嵌套的命名的行 fullname_t 与 Java 类 fullname 之间
的映射,以及数据库服务器上命名的行 person_t 与 Java 类 person 之间的映射。
GBase 8s JDBC Driver 认可对象 who 实现 SQLData 接口,
因此,
它是命名的行、
distinct 类
型,
或 opaque 类型。
对于此对象,
GBase 8s JDBC Driver 调用 getSQLTypeName() 方法
(需
要类实现 SQLData 接口),其返回 person_t。驱动程序查找 person_t,并发现它是命名的
行。
对于类中的每一成员,
person 类中的 writeSQL() 方法调用对应的 SQLOutput.writeXXX() 方
法,将其每一都映射至命名的行 person_t 中的一个字段。该类中的 writeSQL() 方法包含
对 SQLOutput.writeObject(name) 和 SQLOutput.writeInt(id) 方法的调用。序列化类 person 的
每一成员,并写至流内。