jdbcTemplate 调用存储过程。 入参 array 返回 cursor
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。
* @author Alan
* @Email no008@foxmail.com
正文
注:本文来源《 jdbcTemplate 调用存储过程。 入参 array 返回 cursor 》
需求:
java传入一个list object。从数据库找到相关的数据并返回。
如果循环取数据,那么会产生N条SQL。(N为 list 的size)
开始计划使用临时表,先把list数据插入到数据库。可以使用批量插入,虽然也需要产生N条SQL,但是性能应该会比N个查询快很多。(不过没有实践)。
同事提醒说可以用存储过程,批量查询。之前并没有这么使用过。开始以为要使用in(id1, id2)那么查询。之前存储过程也没怎么使用过。大部分都是直接操作SQL。
实现过程
1)创建TYPE
2 ) 创建TYPE OF TABLE
3) 创建存储过程
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
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?