/**PageBeginHtml Block Begin **/ /***自定义返回顶部小火箭***/ /*生成博客目录的JS 开始*/ /*生成博客目录的JS 结束*/

jdbcTemplate 调用存储过程。 入参 array 返回 cursor

* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。
* @author Alan
* @Email no008@foxmail.com

 

正文

注:本文来源《   jdbcTemplate 调用存储过程。 入参 array 返回 cursor   》

需求:

java传入一个list object。从数据库找到相关的数据并返回。

如果循环取数据,那么会产生N条SQL。(N为 list 的size)

开始计划使用临时表,先把list数据插入到数据库。可以使用批量插入,虽然也需要产生N条SQL,但是性能应该会比N个查询快很多。(不过没有实践)。

同事提醒说可以用存储过程,批量查询。之前并没有这么使用过。开始以为要使用in(id1, id2)那么查询。之前存储过程也没怎么使用过。大部分都是直接操作SQL。

实现过程

1)创建TYPE

  1 CREATE OR REPLACE TYPE TEST_OBJECT AS OBJECT
  2 (
  3    COLUMN1 VARCHAR2(50),
  4    COLUMN2 NUMBER(10,2)
  5 )

2 ) 创建TYPE OF TABLE

  1 CREATE OR REPLACE TYPE "TEST_OBJECT_ARRAY" AS TABLE OF TEST_OBJECT

3) 创建存储过程

  1 CREATE OR REPLACE PROCEDURE PROC_DD_GETPERSONINFO(V_TEST_LIST IN TEST_OBJECT ,
  2 P_CUR OUT SYS_REFCURSOR
  3 )
  4 
  5 入参是一个就可以变成一个数组,在使用的时候类似于临时表使用。
  6 
  7 SELECT * FROM TABLE(V_TEST_LIST)
  8 

4) 编写java代码

复制代码
  1 @Repository
  2  public class DataCacheDaoImpl implements DataCacheDao {
  3 
  4     @Autowired
  5      JdbcTemplate jdbcTemplate;
  6 
  7     private ARRAY getArray(List<TestObject> list, Connection con) throws SQLException {
  8          STRUCT[] struts = new STRUCT[list.size()];
  9          int i = 0;
 10          for (TestObject cr : list) {
 11 
 12             Object[] obs = { cr.getContractNumber(), cr.getReceiveAmount() };
 13              //mapping to object
 14              StructDescriptor st = new StructDescriptor("TEST_OBJECT", con);
 15              struts[i] = new STRUCT(st, con, obs);
 16          }
 17 
 18         //mapping to array 
 19          ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("TEST_OBJECT_ARRAY", con);
 20          ARRAY deptArrayObject = new ARRAY(arrayDept, con, struts);
 21          return deptArrayObject;
 22      }
 23 
 24     @Override
 25      public List<TestObjectResponse> getContractRepaymentList(List<TestObject> list) {
 26 
 27         return jdbcTemplate.execute(new CallableStatementCreator() {
 28 
 29             @Override
 30              public CallableStatement createCallableStatement(Connection con) throws SQLException {
 31 
 32                 if (con.isWrapperFor(OracleConnection.class)) {
 33                      con = con.unwrap(OracleConnection.class);
 34                  }
 35 
 36                 String callProcedure = "{call PROC_DD_GETPERSONINFO(?,?)}";
 37                  CallableStatement cs = con.prepareCall(callProcedure);
 38                  ARRAY array = getArray(list, con);
 39 
 40                 cs.setArray(1, array);
 41                  cs.registerOutParameter(2, OracleTypes.CURSOR);
 42 
 43                 return cs;
 44              }
 45 
 46         }, new CallableStatementCallback<List<TestObjectResponse>>() {
 47 
 48             @Override
 49              public List<TestObjectResponse> doInCallableStatement(CallableStatement cs)
 50                      throws SQLException, DataAccessException {
 51 
 52                 List<TestObjectResponse> list = new ArrayList<>();
 53 
 54                 cs.execute();
 55 
 56                 ResultSet rs = (ResultSet) cs.getObject(2);
 57                  while (rs.next()) {
 58                      TestObjectResponse response = new TestObjectResponse();
 59                      // 组装你的bean
 60                      list.add(response);
 61                  }
 62                  return list;
 63              }
 64          });
 65      }
 66  }
 67 
复制代码

posted @   一品堂.技术学习笔记  阅读(1313)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示

目录导航