具体步骤
- 连接数据库
连接串常用参数推荐如下,具体设置方法可参考《开发指南》中“应用程序开发教程 > 基于JDBC开发 > 开发步骤 > 连接数据库”章节。
- connectTimeout:用于连接服务器操作系统的超时值,单位为秒。当JDBC与数据库建立TCP连接的时间超过此值,则连接断开。根据网络情况进行配置。默认值:0,推荐值:2。
- socketTimeout:用于socket读取操作的超时值,单位为秒。如果从服务器读取数据流所花费的时间超过此值,则连接关闭。如果不配置该参数,在数据库进程异常情况下,会导致客户端出现长时间等待,建议根据业务可以接受的SQL执行时间进行配置。默认值:0,无推荐值。
- connectionExtraInfo:表示驱动是否将当前驱动的部署路径、进程属主用户以及url连接配置信息上报到数据库。默认值:false,推荐值:true。
- logger:应用如果使用第三方日志框架记录日志信息,推荐使用实现slf4j接口的第三方日志框架记录JDBC日志,方便出现异常定位。使用了第三方日志框架的推荐值:Slf4JLogger。
String url = "jdbc:gaussdb://$ip:$port/database?connectTimeout=xx&socketTimeout=xx&connectionExtraInfo=true&logger=Slf4JLogger&autoBalance=true" Connection conn = DriverManager.getConnection("url",userName,password);
- 设置GUC参数
执行SQL语句“SET behavior_compat_options='proc_outparam_override';”,打开proc_outparam_override后支持存储过程的重载。
Statement statement = conn.createStatement(); statement.execute("SET behavior_compat_options='proc_outparam_override'"); statement.close();
- 预编译存储过程
通过Call语法声明调用存储过程TEST_PROC的SQL语句,然后使用prepareCall对这条语句进行预编译。
CallableStatement cs = conn.prepareCall("{CALL PUBLIC.TEST_PROC(?,?,?,?)}");
- 绑定入参
使用PGobject对满足自定类型的数据进行组装,然后使用prepareCall进行入参绑定。
PGobject pgObject = new PGobject(); pgObject.setType("public.compfoo"); // 设置复合类型名。 pgObject.setValue("(1,demo)"); // 绑定复合类型值,格式为"(value1,value2)"。 cs.setObject(1, pgObject); pgObject = new PGobject(); pgObject.setType("public.compfoo_table"); // 设置Table类型名。 pgObject.setValue("{\"(10,demo10)\",\"(11,demo111)\"}"); // 绑定Table类型值,格式为"{\"(value1,value2)\",\"(value1,value2)\",...}"。 cs.setObject(2, pgObject);
- 注册出参类型
使用prepareCall对存储过程的出参进行注册,根据复合类型或者Table类型注册为Types.STRUCT和Types.ARRAY。
// 注册out类型的参数,类型为复合类型。 cs.registerOutParameter(3, Types.STRUCT, "public.compfoo"); // 注册out类型的参数,类型为Table类型。 cs.registerOutParameter(4, Types.ARRAY, "public.compfoo_table");
- 执行并查看结果
调用存储过程,查看出参对应的结果。
cs.execute(); // 获取输出参数。 // 返回结构是自定义类型。 PGobject result = (PGobject) cs.getObject(3); // 获取out参数。 result.getValue(); // 获取复合类型字符串形式值。 String[] arrayValue = result.getArrayValue(); // 获取复合类型数组形式值,以复合数据类型字段顺序排序。 result.getStruct(); // 获取复合类型子类型名,按创建顺序排序。 result.getAttributes(); // 返回自定义类型每列组成类型的对象,对于array类型和table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。 for (String s : arrayValue) { System.out.println(s); } PgArray pgArray = (PgArray) cs.getObject(4); ResultSet rs = pgArray.getResultSet(); Object[] array = (Object[]) pgArray.getArray(); for (Object element : array) { System.out.println(element); }
- 释放资源和关闭数据库连接
cs.close(); conn.close();
- 【可选】异常处理
在程序运行中需要使用try-catch模块对SQLException做异常处理,根据自身业务在异常处理逻辑部分添加对异常的处理逻辑。
try { // 业务代码。 } catch (SQLException e) { // 异常处理逻辑。 }