更新时间:2025-08-19 GMT+08:00
分享

具体步骤

  1. 连接数据库

    连接串常用参数推荐如下,具体设置方法可参考《开发指南》中“应用程序开发教程 > 基于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);

  2. 设置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();

  3. 预编译存储过程

    通过Call语法声明调用存储过程TEST_PROC的SQL语句,然后使用prepareCall对这条语句进行预编译。
    CallableStatement cs = conn.prepareCall("{CALL PUBLIC.TEST_PROC(?,?,?,?)}");

  4. 绑定入参

    使用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);

  5. 注册出参类型

    使用prepareCall对存储过程的出参进行注册,根据复合类型或者Table类型注册为Types.STRUCT和Types.ARRAY。

    // 注册out类型的参数,类型为复合类型。
    cs.registerOutParameter(3, Types.STRUCT, "public.compfoo");
    // 注册out类型的参数,类型为Table类型。
    cs.registerOutParameter(4, Types.ARRAY, "public.compfoo_table");

  6. 执行并查看结果

    调用存储过程,查看出参对应的结果。

    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);
    }

  7. 释放资源和关闭数据库连接

    cs.close();
    conn.close();

  8. 【可选】异常处理

    在程序运行中需要使用try-catch模块对SQLException做异常处理,根据自身业务在异常处理逻辑部分添加对异常的处理逻辑。
    try {
       // 业务代码。
    } catch (SQLException e) {
       // 异常处理逻辑。
    }

相关文档