zoukankan      html  css  js  c++  java
  • jdbcTemplate 调用存储过程。 入参 array 返回 cursor

    注:本文来源《   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 

  • 相关阅读:
    sizeof和strlen的区别
    备注
    将一个正整数分解质因数
    malloc和new有什么区别
    用C来实现内存池
    句柄和指针的区别和联系是什么?
    c/c++ 宏中"#"和"##"的用法
    手机上网的原理
    数据类型转换(转自CSDN)
    vc debug和Release的切换
  • 原文地址:https://www.cnblogs.com/ios9/p/8858114.html
Copyright © 2011-2022 走看看