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

jdbcTemplate 调用存储过程。 入参 array 返回 cursor的更多相关文章

  1. spring jdbctemplate调用存储过程,返回list对象

    注:本文来源于<  spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...

  2. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  3. Spring如何使用JdbcTemplate调用存储过程的三种情况

    注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...

  4. c++调用python系列(1): 结构体作为入参及返回结构体

    最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...

  5. Spring JdbcTemplate 调用存储过程

    遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...

  6. Oracle存储过程入参传入List集合的小例子

    第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...

  7. mybatis调用存储过程 无参、带有输入输出参数,输出游标类型的 存储

    存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的 ...

  8. 从输出日志中提取接口的入参和返回做为用例导入到excel中

    1  背景 接口用例已经在项目中的yml文件中编写,但是yml文件不能做为交付文档用,本文对工作中从接口输出日志中提取用例信息,并导入到excel文件中做了总些 2  工具 idea,notepad+ ...

  9. C#调用存储过程详解(带返回值、参数输入输出等)

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

随机推荐

  1. promise.all方法合并请求接口的两个值

    function promise1 = new Promise((resolve,reject)=>{ return result1 }) function promise2 = new Pro ...

  2. Java EE之Request部分方法使用示例

    Description: ApplicationProjectName:MedicineMs login.jsp[action:login|method:get] to loginServlet Ou ...

  3. PHP7语法知识(一):语言基础

    一.数据类型 1.字符串: 2.整形: var_dump函数:返回变量的数据类型和值. 3.浮点型: 4.布尔型: 5.数组: 6.对象: 7.NULL值 二.运算符 1.算术运算符: 2.递增递减运 ...

  4. 《从Paxos到Zookeeper:分布式一致性原理与实践》第一章读书笔记

    第一章主要介绍了计算机系统从集中式向分布式系统演变过程中面临的挑战,并简要介绍了ACID.CAP和BASE等经典分布式理论,主要包含以下内容: 集中式的特点 分布式的特点 分布式环境的各种问题 ACI ...

  5. 如何解压RPM包

    有时我们需要RPM包中的某个文件,如何解压RPM包呢? RPM包括是使用cpio格式打包的,因此可以先转成cpio然后解压,如下所示: rpm2cpio xxx.rpm | cpio -div 解压了 ...

  6. IOC 和DI的区别

    什么是spring的IOC AOP? - Goluck98的专栏 - 博客频道 - CSDN.NET---看前面的那段http://blog.csdn.net/goluck98/article/det ...

  7. 20165237 2017-2018-2 《Java程序设计》第4周学习总结

    20165237 2017-2018-2 <Java程序设计>第4周学习总结 教材学习内容总结 1.子类只能有一个父类,父类可以有多个子类. 2.子类继承父类的成员变量和方法. 3.开闭原 ...

  8. 不指定虚拟路径的前提下通过http访问pdf、图片等文件

    通常我们通过http访问图片或者pdf的时候都是将文件上传到指定文件夹下面,然后通过配置虚拟路径来访问指定的资源. 在不配置虚拟路径的情况下,我们通过获取到response的outpurstream, ...

  9. C/C++ assert()函数用法总结

    1. 简介 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行. 原型定义: #include <assert.h>void ass ...

  10. Segmentation metrics

    (1)FCN中引入的四种Metrics: