jdbcTemplate 调用存储过程。 入参 array 返回 cursor
来源:互联网 发布:颜值 知乎 编辑:程序博客网 时间:2024/06/16 04:32
需求:
java传入一个list object。从数据库找到相关的数据并返回。
如果循环取数据,那么会产生N条SQL。(N为 list 的size)
开始计划使用临时表,先把list数据插入到数据库。可以使用批量插入,虽然也需要产生N条SQL,但是性能应该会比N个查询快很多。(不过没有实践)。
同事提醒说可以用存储过程,批量查询。之前并没有这么使用过。开始以为要使用in(id1, id2)那么查询。之前存储过程也没怎么使用过。大部分都是直接操作SQL。
首先创建存储过程,
1)创建TYPE
CREATE OR REPLACE TYPE TEST_OBJECT AS OBJECT
(
COLUMN1 VARCHAR2(50),
COLUMN2 NUMBER(10,2)
)
2 ) 创建TYPE OF TABLE
CREATE OR REPLACE TYPE "TEST_OBJECT_ARRAY" AS TABLE OF TEST_OBJECT
3) 创建存储过程
CREATE OR REPLACE PROCEDURE PROC_DD_GETPERSONINFO(V_TEST_LIST IN TEST_OBJECT ,
P_CUR OUT SYS_REFCURSOR
)
入参是一个就可以变成一个数组,在使用的时候类似于临时表使用。
SELECT * FROM TABLE(V_TEST_LIST)
4) 编写java代码
@Repositorypublic class DataCacheDaoImpl implements DataCacheDao {@AutowiredJdbcTemplate jdbcTemplate;private ARRAY getArray(List<TestObject> list, Connection con) throws SQLException {STRUCT[] struts = new STRUCT[list.size()];int i = 0;for (TestObject cr : list) {Object[] obs = { cr.getContractNumber(), cr.getReceiveAmount() };//mapping to objectStructDescriptor st = new StructDescriptor("TEST_OBJECT", con);struts[i] = new STRUCT(st, con, obs);}//mapping to array ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("TEST_OBJECT_ARRAY", con);ARRAY deptArrayObject = new ARRAY(arrayDept, con, struts);return deptArrayObject;}@Overridepublic List<TestObjectResponse> getContractRepaymentList(List<TestObject> list) {return jdbcTemplate.execute(new CallableStatementCreator() {@Overridepublic CallableStatement createCallableStatement(Connection con) throws SQLException {if (con.isWrapperFor(OracleConnection.class)) {con = con.unwrap(OracleConnection.class);}String callProcedure = "{call PROC_DD_GETPERSONINFO(?,?)}";CallableStatement cs = con.prepareCall(callProcedure);ARRAY array = getArray(list, con);cs.setArray(1, array);cs.registerOutParameter(2, OracleTypes.CURSOR);return cs;}}, new CallableStatementCallback<List<TestObjectResponse>>() {@Overridepublic List<TestObjectResponse> doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {List<TestObjectResponse> list = new ArrayList<>();cs.execute();
// 得到返回的cursor
ResultSet rs = (ResultSet) cs.getObject(2);while (rs.next()) {TestObjectResponse response = new TestObjectResponse();// 组装你的beanlist.add(response);}return list;}});}}
阅读全文
0 0
- jdbcTemplate 调用存储过程。 入参 array 返回 cursor
- ibatis 调用oracle存储过程 返回cursor
- java调用Oracle存储过程返回Cursor
- jdbcTemplate 调用存储过程
- jdbcTemplate 调用存储过程
- JdbcTemplate调用存储过程
- JDBCTemplate调用存储过程
- spring jdbctemplate调用存储过程,返回list对象
- oracle执行存储过程返回游标cursor
- Spring JdbcTemplate实现有java.sql.ResultSet结果集返回的存储过程调用
- spring jdbctemplate或jdbc调用返回游标或复杂数据类型的存储过程
- 使用jdbc调用oracle存储过程(返回cursor)的错误及解决方法- -
- Ibatis调用Oracle存储过程,以及返回Cursor结果集的处理
- 通过DB Link调用远程ORACLE存储过程返回CURSOR失败
- spring的jdbcTemplate调用存储过程
- 使用JdbcTemplate调用数据库存储过程
- 使用Spring JdbcTemplate调用存储过程
- JdbcTemplate调用存储过程的一些方法:
- Android UI 自动化测试之项目配置(一)
- python Base64 编码解码
- pl/sql 导入表结构是 comment出错
- 常见的股票技术因子学习以及计算
- 物联网工程就业前景
- jdbcTemplate 调用存储过程。 入参 array 返回 cursor
- 彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题
- 前端之书籍
- 使用选项卡TabWidget与TabHost实现底部或者顶部四个分类按钮 点击切换对应的fragment
- sqlite3触发器的使用
- 数据库
- 筛素数
- 休闲益智类移动游戏的开发潜力
- gulp文件