注:本文来源《   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. 百度地图web api使用案例

    效果如下: 1.获取位置的经纬度: 如坐标:114.110033,22.541098 获取经纬度: http://api.map.baidu.com/lbsapi/getpoint/index.htm ...

  2. Debian Security Advisory(Debian安全报告) DSA-4412-1 drupal7 security update

    Debian Security Advisory(Debian安全报告) DSA-4412-1 drupal7 security update Package:drupal7 CVE ID:暂无 Dr ...

  3. steps/align_si.sh

    usage: steps/align_si.sh <data-dir> <lang-dir> <src-dir> <align-dir> e.g.: s ...

  4. python前后端加密方式

    后端加密方法: python后端加密方式: # 双重工加密 #bytes((7788).encode('utf-8')):为后端加密二把手,多加的锁,该参数可为空,必须加bytes才能实现 md5pa ...

  5. ionic编译安卓App

    安装node.js 安装Android Studio 运行Android Studio安装SDK,在D:\AndroidSDK 配置SDK环境 ANDROID_HOME=D:\AndroidSDK P ...

  6. Django学习手册 - 权限管理(二)

    从数据库获取数据后,对数据进行清洗 目标: 数据1,存放至session 中的数据 数据2,显示至前端的菜单数据 清洗数据: 1.session存放的数据:(menu_leaf_dict) 2.前端菜 ...

  7. Css - 利于搜索引擎收录的三个标签

    Css - 利于搜索引擎收录的三个标签 <head> <meta charset="utf-8" /> <title>京东(JD.COM)-正品 ...

  8. Ettercap内网渗透

    最近网速很卡,于是想到有人在蹭网,怎么捉弄一下呢? 1.开启ettercap ettercap -G 2. Hosts->Scan,List 发现有几个新的地址192.168.1.71,192. ...

  9. eMMC基础技术2:eMMC概述

    0.前言 本文主要参考eMMC规范,从总体上对eMMC 进行简要介绍.主要包含如下的内容: (1)eMMC系统的总体架构 (2)eMMC的总线协议 (3)device controller (4)fl ...

  10. u3d摇杆

    using UnityEngine; using System.Collections; public class JoystickController : MonoBehaviour { priva ...