JDBC API 支持将 SQL 用户定义类型 (UDT) 自定义映射到 Java 编程语言中的类。本章描述了这种映射机制。
17.1 类型映射
类型映射是一个 java.util.Map 对象,它将 SQL UDT 名称与 Java 类关联起来。每个连接都维护一个类型映射,可以通过 Connection.getTypeMap() 方法获取。
1 | Map<String, Class<?>> typeMap = con.getTypeMap(); |
17.2 类约定
自定义映射的 Java 类必须实现 java.sql.SQLData 接口。SQLData 接口定义了以下方法:
readSQL(SQLInput stream, String typeName):从SQL数据流读取数据writeSQL(SQLOutput stream):将数据写入SQL数据流getSQLTypeName():返回SQL类型名称
17.3 SQL 数据流
17.3.1 检索数据
当使用 getObject 方法检索 UDT 时,JDBC 驱动程序会:
- 确定类型映射中是否定义了该
UDT的自定义映射 - 如果有,创建相应
Java类的实例 - 调用
readSQL方法填充对象
1 | Address addr = (Address) rs.getObject("address_column"); |
17.3.2 存储数据
当使用 setObject 方法存储 Java 对象时,JDBC 驱动程序会:
- 检查对象是否实现
SQLData接口 - 如果是,调用
writeSQL方法序列化对象
1 | pstmt.setObject(1, address); |
17.4 示例
17.4.1 SQL 结构化类型
1 | CREATE TYPE ADDRESS AS ( |
17.4.2 SQLData 实现
1 | public class Address implements SQLData { |
17.4.3 在 Java 编程语言中镜像 SQL 继承
当 SQL 结构化类型参与继承层次结构时,Java 类也应该反映这种层次结构。
17.4.4 SQL DISTINCT 类型映射示例
1 | CREATE TYPE MONEY AS DECIMAL(10, 2); |
1 | public class Money implements SQLData { |
17.5 变换组的效果
变换组是 SQL:2003 的一项功能,允许根据上下文以不同方式表示 UDT。JDBC 驱动程序可能支持也可能不支持此功能。
17.6 方法的通用性
自定义类型映射方法也适用于:
Distinct类型- 结构化类型
- 数组元素
17.7 NULL 数据
当 SQL UDT 值为 NULL 时,getObject 方法返回 Java null。
