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
相关产品推荐
相关产品推荐

