注:本文来源《   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. 遍历页面上的checkbox

    $("#Button1").click(function () { $("input[type='checkbox']").each(function () { ...

  2. springboot-01 helloworld

    第一个springboot程序 新建maven项目,添加如下依赖: <?xml version="1.0" encoding="UTF-8"?> & ...

  3. MySQL自动编号与主键

    1.自动编号(AUTO_INCREMENT),必须与主键组合使用 默认情况下,起始值为1,增量也为1. 2.主键(PRIMARY KEY) 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为 ...

  4. [C++]2-6 排列

    /* 排列(Permutation) 用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3. 按照"abc def ...

  5. call apply bind 区别?

    call apply bind 区别? 例:定义一个计算器,没绑定bind的为公共计算器,call可以调用,绑定bind的为私人计算器,别人调用不了, //ps:用bind绑定的call强制作借用不好 ...

  6. 使用Python的turtle库画圣诞树

    代码如下: from turtle import * import random import time n = 80.0 speed("fastest") screensize( ...

  7. intellij idea无效的发型版本1.8解决方案

    描述:intellj中启动项目报错无效的发行版本:8 解决方案一: file -> settings -> build,exception,deployment -> compile ...

  8. 关于vmvawe的光驱,iso镜像,挂载,卸载

    勾选这个使用iso镜像文件,就相当于真实的环境下,将一张光盘插进了光驱里,然后再勾选启动时连接,那么在linux开机后,/dev/cdrom或者/dev/sr0(前者是后者的软连接)就表示这个硬件设备 ...

  9. 20165234 《Java程序设计》第六周学习总结

    第六周学习总结 教材学习内容总结 第八章 常用实用类 String类 Java专门提供了用来处理字符序列的 String 类.String类在java.lang包中,由于 java.lang 包中的类 ...

  10. 【转载】奇异值分解(SVD)计算过程示例

    原文链接:奇异值分解(SVD)的计算方法 奇异值分解是线性代数中一种重要的矩阵分解方法,这篇文章通过一个具体的例子来说明如何对一个矩阵A进行奇异值分解. 首先,对于一个m*n的矩阵,如果存在正交矩阵U ...