升级ojdbc8后,如何用java.sql.Struct替代oracle.sql.STRUCT适配MutableStruct?
解决方案
临时过渡方案(兼容现有代码)
虽然oracle.sql.STRUCT已被标记为弃用,但在ojdbc8中该类仍存在且可正常运行。如果你的java.sql.Struct实例是Oracle JDBC驱动的实现类(通常为oracle.jdbc.OracleStruct,它继承自oracle.sql.STRUCT),可直接向下转型适配MutableStruct构造器:
java.sql.Struct standardStruct = <从JDBC操作获取的标准Struct实例>; MutableStruct struct = new MutableStruct((oracle.sql.STRUCT) standardStruct, sqlType, factory);
注意:该方案仅作临时过渡,Oracle未来版本可能移除oracle.sql.STRUCT,需尽快迁移至标准JDBC实现。
长期替代方案(彻底弃用Oracle专有类)
1. 重新用JPublisher生成适配ojdbc8的代码
JPublisher在ojdbc8环境下可生成基于标准JDBC API(java.sql.Struct)的代码,无需依赖oracle.sql.STRUCT和MutableStruct。重新生成步骤:
- 确保JPublisher使用ojdbc8.jar及配套工具包
- 执行JPublisher命令时指定标准JDBC兼容参数,示例:
其中jpub -user=用户名/密码 -sql=你的PLSQL包名 -usertypes=jdbc -methods=all-usertypes=jdbc参数会让JPublisher生成基于标准JDBC类型的映射代码,替代原有Oracle专有类型。
2. 自定义Struct包装类替代MutableStruct
若无法重新生成代码,可自定义类封装java.sql.Struct,实现MutableStruct的核心功能:
import java.sql.Struct; import java.sql.SQLException; public class StandardMutableStruct { private Struct underlyingStruct; private int[] sqlTypes; public StandardMutableStruct(Struct struct, int[] sqlTypes) throws SQLException { this.underlyingStruct = struct; this.sqlTypes = sqlTypes; // 参考原MutableStruct的初始化逻辑补充 } // 实现原MutableStruct的属性操作方法 public Object getAttribute(int index) throws SQLException { return underlyingStruct.getAttributes()[index]; } // 根据业务需求添加其他方法... }
之后将原有代码中的MutableStruct替换为自定义的StandardMutableStruct,并修改构造参数为java.sql.Struct。
内容的提问来源于stack exchange,提问作者Bittnutz
相关产品推荐
相关产品推荐

