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
jdbcTemplate 调用存储过程。 入参 array 返回 cursor的更多相关文章
- spring jdbctemplate调用存储过程,返回list对象
注:本文来源于< spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...
- ADO.NET访问SQL Server调用存储过程带回参
1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...
- Spring如何使用JdbcTemplate调用存储过程的三种情况
注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...
- c++调用python系列(1): 结构体作为入参及返回结构体
最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...
- Spring JdbcTemplate 调用存储过程
遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...
- Oracle存储过程入参传入List集合的小例子
第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...
- mybatis调用存储过程 无参、带有输入输出参数,输出游标类型的 存储
存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的 ...
- 从输出日志中提取接口的入参和返回做为用例导入到excel中
1 背景 接口用例已经在项目中的yml文件中编写,但是yml文件不能做为交付文档用,本文对工作中从接口输出日志中提取用例信息,并导入到excel文件中做了总些 2 工具 idea,notepad+ ...
- C#调用存储过程详解(带返回值、参数输入输出等)
CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...
随机推荐
- Docker 空间大小设置 - 十
一.容器启动 默认存储大小: 1.一种在启动项 docker.service 中配置. 2.在启动项配置调用的 docker-storage 配置文件中配置: 二.Docker 容器默认启动文件: / ...
- react编译报错:Import in body of module; reorder to top import/first
原因是这样的: 我把一个组件分为三个文件, |—Home.jsx // 业务逻辑与html Home——|—Home.css // 样式 |—index.js // 引入Home.css ,再把Hom ...
- PHP7语法知识(一):语言基础
一.数据类型 1.字符串: 2.整形: var_dump函数:返回变量的数据类型和值. 3.浮点型: 4.布尔型: 5.数组: 6.对象: 7.NULL值 二.运算符 1.算术运算符: 2.递增递减运 ...
- Socket与TCP,UDP
什么是socket 简单来说是IP地址与端口的结合协议(RFC 793) 一种地址与端口的结合描述协议 TCP/IP协议的 相关API的总称:是网络api的集合实现 涵盖了:Stream Socket ...
- Leetcode#169. Majority Element(求众数)
题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...
- Setup Mission End
编写FPSGameMode 新建函数OnMissionComplete,并设置为蓝图可实现事件 UFUNCTION(BlueprintImplementableEvent,Category=" ...
- 前端 - jsonp 跨域ajax
jsonp 跨域ajax原理: 浏览器同源策略限制 如何解决同源策略限制: 方式一: 利用创建script块,在其中执行src属性为 远程url 异域 用函数(返回值) 的形式返回参数 方式二: jq ...
- html转成pdf,下载(html2canvas 和 jsPDF)
参考链接:https://github.com/linwalker/render-html-to-pdf
- string.Empty, "" 和 null 三者的区别
转载:http://www.cnblogs.com/mxxblog/archive/2013/08/22/3275387.html 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得 ...
- Pytorch tutorial 之Transfer Learning
引自官方: Transfer Learning tutorial Ng在Deeplearning.ai中讲过迁移学习适用于任务A.B有相同输入.任务B比任务A有更少的数据.A任务的低级特征有助于任务 ...