Spring 框架下,用数组作为参数 传入到 存储过程,或存储过程返回动态数组到java程序 ,BLOB等大对象类似
2011-06-03 22:31
609 查看
一、用数组作为参数 传入到 存储过程
与ORACLE数组对应的 只能是 ORACLE.SQL.ARRAY 对象,而构造这个对象 需要 本地数据库连接JAVA.SQL.Connection 和 ORACLE.SQL.ArrayDescription 对象。
在Spring架构下,要获取到 本地Connection,找到资料基本是关于 ParameterMapper接口,但是实验了后才知道,这个方案还是需要Connection作为参数,继续寻找。
后来在《Spring 让 LOB 数据操作变得简单易行
》 这篇文章中找到了方法。 需要在Spring的配置文件中添加相应的Bean,如下:
STR_VARLIST 是在Oracle数据库中定义的动态数组。
二、 存储过程的动态数组 返回到 java程序处理
关键点是 用ORACLE.SQL.ARRAY 类型来接收。用例子来说话:
【参考】
1. http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html
与ORACLE数组对应的 只能是 ORACLE.SQL.ARRAY 对象,而构造这个对象 需要 本地数据库连接JAVA.SQL.Connection 和 ORACLE.SQL.ArrayDescription 对象。
在Spring架构下,要获取到 本地Connection,找到资料基本是关于 ParameterMapper接口,但是实验了后才知道,这个方案还是需要Connection作为参数,继续寻找。
后来在《Spring 让 LOB 数据操作变得简单易行
》 这篇文章中找到了方法。 需要在Spring的配置文件中添加相应的Bean,如下:
//Spring配置文件 JdbcTemplate配置部分 <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" /> <bean id="utmsJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="DataSource" ref="utmDataSource" /> <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/> </bean> //DAO层的实现 import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import java.sql.Connection; @Override public String testArray() throws SQLException{ String procName = "TAGEXTENDLIB_TEST"; List<SqlParameter> sqlParameters = new ArrayList<SqlParameter>(); sqlParameters.add(new SqlParameter("IN_WORDSLIST",OracleTypes.ARRAY,"STR_VARLIST")); sqlParameters.add(new SqlOutParameter("OUT_VAR",OracleTypes.VARCHAR)); String [] params = {"实验室","传媒大学"}; Connection conn = DataSourceUtils.getConnection(getJdbcTemplate().getDataSource()); conn = getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(conn); ArrayDescriptor desc = new ArrayDescriptor("STR_VARLIST", conn); ARRAY arrayWords = new ARRAY(desc, conn, params); HashMap parameters = new HashMap(); parameters.put("IN_WORDSLIST", arrayWords); CustomStoragedProcedure customStoragedProcedure = new CustomStoragedProcedure( this.getJdbcTemplate().getDataSource(), procName, sqlParameters); Map map= customStoragedProcedure.execute(parameters); String output = (String)map.get("OUT_VAR"); //System.out.println(output); return output; }
STR_VARLIST 是在Oracle数据库中定义的动态数组。
二、 存储过程的动态数组 返回到 java程序处理
关键点是 用ORACLE.SQL.ARRAY 类型来接收。用例子来说话:
@Override public List<String> getSimilarPinyin(String words) { // TODO Auto-generated method stub String procName = "TAGSTANDARDLIB_GETTIPS"; List<SqlParameter> sqlParameters = new ArrayList<SqlParameter>(); sqlParameters.add(new SqlParameter("IN_PINYININDEX",OracleTypes.VARCHAR)); sqlParameters.add(new SqlOutParameter("OUT_PINYINSTRLIST",OracleTypes.ARRAY,"STR_VARLIST")); HashMap parameters = new HashMap(); parameters.put("IN_PINYININDEX", words); CustomStoragedProcedure customStoragedProcedure = new CustomStoragedProcedure( this.getJdbcTemplate().getDataSource(), procName, sqlParameters); Map map= customStoragedProcedure.execute(parameters); List<String> tagStandards = new ArrayList<String>(); try { ARRAY array = (ARRAY)map.get("OUT_PINYINSTRLIST"); String[] values = (String[])array.getArray(); for(int i=0; i<values.length; i++){ tagStandards.add(values[i]); } } catch (Exception e) { e.printStackTrace(); } return tagStandards==null?null:tagStandards;
【参考】
1. http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html
相关文章推荐
- Java中传入和取得oracle10g存储过程返回的数组对象(多维数组)
- 【java】值传递和引用传递---对象作为方法的参数传入属于哪种传递
- Java之Vector向量类实现自动动态增长的对象数组-类似动态数组
- Oracle存储过程传入类似java中list、数组类型的参数并使用
- java 调用存储过程 传入和返回全部是自定义数组
- SqlServer 动态SQL(存储过程)中Like 传入参数无正确返回值的问题
- 关于JAVA调用ORACLE存储过程时,传入动态参数作为in语句条件的问题
- java中要注意对象作为参数引用返回时,对象本身是否变化了
- java 11:数组作为函数参数,数组做为函数返回值
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- java 11:数组作为函数参数,数组做为函数返回值
- 关于JAVA调用ORACLE存储过程时,传入动态参数作为in语句条件的问题
- java中的arrayList传入oracle中的以数组(array)为参数的存储过程
- 学习android JNI的那些事儿--------6. 在java中传入引用数据类型(对象)作为参数
- 黑马程序员--09.动态与代理AOP--06【动态代理实例化的过程升级--目标对象+系统功能的参数化】【实现类似Spring的可配置AOP框架】
- java 调用oracle存储过程传入 数组参数 不用纯jdbc连接
- js Array.from 从类似数组 或者可迭代对象中返回数组
- 如何将二位数组作为参数传入函数。
- Java框架spring 学习笔记(八):注入对象类型属性
- 数组作为参数时,传入基类首地址和子类首地址的区别