You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot中用JdbcTemplate调用带自定义类型参数的PostgreSQL存储过程

在Spring Boot中用JdbcTemplate调用带自定义类型数组参数的PostgreSQL存储过程

PostgreSQL的自定义类型数组参数在Spring Boot中是支持的,核心是通过JDBC的SQLData接口映射自定义类型,再手动创建PG数组绑定参数,具体实现步骤如下:

1. 实现对应自定义类型的SQLData类

创建与数据库t_item类型对应的SQLData实现类,让JDBC能识别并转换该类型:

import java.sql.SQLData
import java.sql.SQLInput
import java.sql.SQLOutput

class ItemSqlData(
    var name: String? = null,
    var count: Int? = null
) : SQLData {
    // 必须返回数据库中自定义类型的准确名称
    override fun getSQLTypeName(): String = "t_item"

    override fun readSQL(input: SQLInput, typeName: String?) {
        name = input.readString()
        count = input.readInt()
    }

    override fun writeSQL(output: SQLOutput) {
        output.writeString(name)
        output.writeInt(count ?: 0)
    }
}

2. 在Service中完成参数绑定与存储过程调用

将业务模型ItemModel转换为ItemSqlData数组,再通过JDBC连接创建PG自定义类型数组,最终绑定到存储过程参数:

@Service
class MyService {

    @Autowired
    private lateinit var jdbcTemplate: JdbcTemplate

    fun processItems(items: Array<ItemModel>) {
        // 业务模型转SQLData实现类
        val sqlItems = items.map { item ->
            ItemSqlData(item.name, item.count)
        }.toTypedArray()

        jdbcTemplate.update({ connection ->
            val callStmt = connection.prepareCall("call process_items(?)")
            // 创建PostgreSQL自定义类型数组
            val pgArray = connection.createArrayOf("t_item", sqlItems)
            callStmt.setArray(1, pgArray)
            callStmt
        }) { stmt -> stmt.executeUpdate() }
    }
}

注意事项

  • 确保项目中引入了PostgreSQL JDBC驱动(Spring Boot的spring-boot-starter-data-jdbc或postgresql依赖已包含)
  • 自定义类型名称(t_item)必须与数据库中定义的完全一致,大小写敏感
  • 如果ItemModel是Kotlin数据类,直接映射字段即可,无需额外处理

内容的提问来源于stack exchange,提问作者spatialguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:46:07