ProcedureCall.createStoredProcedureCall()非实体类使用优雅方案
存储过程结果映射非实体类的简化实现方案
现有方案痛点
- 原生
resultSetMappings方案在面对20个以上返回字段的场景时,需要编写超长的逐字段映射配置,开发效率和手动循环遍历ResultSet赋值没有本质区别,多查询场景下重复编码量极高。
期望实现效果
仅通过自定义注解标记非实体类,即可在存储过程调用时直接传入类类型,自动完成全字段结果映射,无需逐字段编写配置:
- 标记非实体映射类
@NonEntityMapper public class Object1{ // 20+ 业务属性 }
- 直接传入类类型调用存储过程
createStoredProcedureCall("SP_NAME", Object1.class)
具体实现方案
核心逻辑是封装通用自动映射逻辑,替代逐字段硬编码配置:
- 首先自定义
@NonEntityMapper类注解,标记该类为存储过程返回结果的映射目标DTO,默认开启类属性与返回列的自动名匹配:支持下划线列名转小驼峰属性名的自动映射(如返回列create_time自动匹配属性createTime)、完全同名列直接映射。 - 封装通用的
createStoredProcedureCall工具方法,入参为存储过程名称、映射目标类类型:- 方法内部调用底层ORM框架或者原生JDBC能力执行存储过程,获取原始ResultSet结果集
- 首次加载某个DTO类时,通过反射扫描类的所有属性,提前构建「返回列名 -> 属性赋值方法」的映射关系缓存,后续重复调用直接读缓存
- 遍历ResultSet逐行读取数据时,按映射关系自动给对应属性赋值,最终返回填充完成的DTO实例集合
- 针对个别列名和属性名无法自动匹配的特殊场景,可额外增加一个字段级注解
@MapperColumn("db_col_name")做单独配置即可,不需要给所有字段写映射。
这套逻辑是通用可复用的,后续新增任意多字段的存储过程查询,只需要定义对应属性的DTO类加@NonEntityMapper注解,不需要编写任何额外的映射配置,重复编码量可以降到最低。
内容的提问来源于stack exchange,提问作者Francis G
相关产品推荐
相关产品推荐

