博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
阅读量:6329 次
发布时间:2019-06-22

本文共 2831 字,大约阅读时间需要 9 分钟。

注:本文来源《      》

需求:

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

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

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

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

实现过程

1)创建TYPE

1   REPLACE TYPE TEST_OBJECT  OBJECT  2 (  3    1 2(50),  4    2 NUMBER(10,2)  5 )

2 ) 创建TYPE OF TABLE

1   REPLACE TYPE "TEST_OBJECT_ARRAY"    TEST_OBJECT

3) 创建存储过程

1   REPLACE  PROC_DD_GETPERSONINFO(V_TEST_LIST  TEST_OBJECT ,  2 P_CUR OUT SYS_REFCURSOR  3 )  4   5 入参是一个就可以变成一个数组,在使用的时候类似于临时表使用。  6   7  *  (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
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
getContractRepaymentList(List
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
>() { 47 48 @Override 49 public List
doInCallableStatement(CallableStatement cs) 50 throws SQLException, DataAccessException { 51 52 List
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

转载地址:http://wvfoa.baihongyu.com/

你可能感兴趣的文章
Can't connect to MySQL server on 'localhost'
查看>>
【Magedu】Week01
查看>>
写给MongoDB开发者的50条建议Tip25
查看>>
PostgreSQL学习手册(四) 常用数据类型
查看>>
为什么要让带宽制约云计算发展
查看>>
[iOS Animation]-CALayer 绘图效率
查看>>
2012-8-5
查看>>
VS中ProjectDir的值以及$(ProjectDir)../的含义
查看>>
我的友情链接
查看>>
PHP实现排序算法
查看>>
Business Contact Mnanager for Outlook2010
查看>>
9种用户体验设计的状态是必须知道的(五)
查看>>
解决WIN7下组播问题
查看>>
陈松松:视频营销成交率低,这三个因素没到位
查看>>
vmware nat模式原理探究,实现虚拟机跨网段管理
查看>>
JavaSE 学习参考:集合运算
查看>>
CSS属性:font-family
查看>>
【Signals and Systems】 SYLLABUS
查看>>
RH135-2-command-line-interface
查看>>
浅谈OS
查看>>