ibatis调用存储过程入参问题

问题描述

CREATE OR REPLACE TYPE EMP_SALARY_REC AS OBJECT ( EMP_ID NUMBER(5), EMP_NAME VARCHAR2(255), START_DATE DATE, SALARY NUMBER );/CREATE OR REPLACE Type EMP_SALARY_TAB AS TABLE OF EMP_SALARY_REC;/next we will create a small package with one single test procedureCREATE OR REPLACE PACKAGE EMP_SALARY_PKG IS PROCEDURE GET_EMP_SALARIES(i_array IN EMP_SALARY_TAB,o_array OUTEMP_SALARY_TAB);End EMP_SALARY_PKG;/用ibatis就不能配置调用吗?问题补充niwenbin 写道

解决方案

写一个handler,来解析数据库的自定义类型parameterMap 配置<parameter property="p_arr_brno" jdbcType="ARRAY"typeName="LIFEMAN.ANESTEDSTRTABLE"typeHandler="com.palic.elis.integration.dao.typehandler.ArrayTypeHandler"mode="IN" /><parameter property="p_arr_brno" jdbcType="ARRAY"typeName="LIFEMAN.ANESTEDSTRTABLE"typeHandler="com.palic.elis.integration.dao.typehandler.ArrayTypeHandler"mode="OUT" />ArrayTypeHandler类// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://kpdus.tripod.com/jad.html// Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: ArrayTypeHandler.javaimport com.ibatis.sqlmap.engine.type.BaseTypeHandler;import com.ibatis.sqlmap.engine.type.TypeHandler;import java.io.BufferedReader;import java.io.InputStreamReader;import java.sql.*;import java.util.ArrayList;import java.util.List;public class ArrayTypeHandler extends BaseTypeHandlerimplements TypeHandler{public ArrayTypeHandler(){}public void setParameter(PreparedStatement preparedstatement, int i, Object obj, String s)throws SQLException{throw new SQLException("不支持此方法 !!");}public Object getResult(ResultSet resultset, String s)throws SQLException{throw new SQLException("不支持此方法 !!");}public Object getResult(ResultSet resultset, int i)throws SQLException{throw new SQLException("不支持此方法 !!");}public Object getResult(CallableStatement callablestatement, int i)throws SQLException{try{ArrayList arraylist;ResultSet resultset = callablestatement.getArray(i).getResultSet();arraylist = new ArrayList();while (resultset.next()) {java.io.InputStream inputstream = resultset.getBinaryStream(2);if (inputstream != null){BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(inputstream, "GBK"));StringBuffer stringbuffer = new StringBuffer();for (String s = null; (s = bufferedreader.readLine()) != null;)stringbuffer.append(s);arraylist.add(stringbuffer.toString());} else{arraylist.add(null);}}if (callablestatement.wasNull())return null;return arraylist;}catch(Exception exception){ throw new SQLException("TypeHandler异常:" + exception.getMessage());}}public Object valueOf(String s){return null;}}
解决方案二:
<parameterMap id="loaMap" class="java.util.HashMap"> <parameter property="mesage" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT"/>//输出参数 用的是游标<parameter property="feednum" javaType="string" jdbcType="VARCHAR" mode="IN" /><parameter property="depict" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="custname" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="itemname" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="itemmoment" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="usetype" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="outstore" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="outstone" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="feedtype" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="movereason" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="unit" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="dept" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="applydate" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowname" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrownum" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowemail" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowmobile" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowtel" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowaddress" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="feedmanager" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="feedmanagertel" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowdate" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowscalar" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="borrowterm" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="reamark" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="state" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="serialnum" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="department" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="action" javaType="string" jdbcType="VARCHAR" mode="IN"/><parameter property="rowNum" javaType="integer" jdbcType="INTEGER" mode="IN"/></parameterMap><procedure id="LoanProcedure" parameterMap="loaMap" resultClass="java.lang.String"> <![CDATA[ {call MATE_LOCAL_ACTION (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)} ]]></procedure>
解决方案三:
http://jamesqian.iteye.com/admin/blogs/1150712
解决方案四:
Ibatis访问存储过程的配置 zz 2009-10-30 16:35:48| 分类: Java | 标签: |字号大中小 订阅 最近项目里经常需要配置用Ibatis访问存储过程(或函数),多次摸索,发现配置的难点是在于如何配置输入输出参数。现以访问Oracle的存储过程(或函数)举例说明。一般基本的配置要点如下:(1)、访问存储过程(或函数)一般以procedure标签来定义statement。(2)、输入输出的参数需要用parameterMap标签单独定义。(3)、区分输入输出参数用parameter标签的mode属性来定义,分别为”OUT”和”IN”。按照是否有返回值,是否使用游标分类说明如下:第一类,没有返回结果,有输出参数以out标识的过程访问配置样式:<parameterMap id=”functionPramsMap” class=”map”><parameter property=”p1″ jdbcType=”VARCHAR” javaType=”string” mode=”IN”/><parameter property=”p2″ jdbcType=”INTEGER” javaType=”int” mode=”IN”/><parameter property=”p3″ jdbcType=”INTEGER” javaType=”int” mode=”OUT” /></parameterMap><procedure id=”statementId” parameterMap=”functionPramsMap”>{call packageName.functionName(?,?,?)}</procedure>第二类,有返回结果,有输出参数以out标识的过程访问配置样式:<parameterMap id=”functionParamsMap” class=”map”><parameter property=”p0″ jdbcType=” INTEGER” javaType=”string” mode=”OUT”/><parameter property=”p1″ jdbcType=”VARCHAR” javaType=”string” mode=”IN”/><parameter property=”p2″ jdbcType=”INTEGER” javaType=”int” mode=”IN”/><parameter property=”p3″ jdbcType=”INTEGER” javaType=”int” mode=”OUT” /></parameterMap><procedure id=”statementId” parameterMap=” functionParamsMap”>{?=call packageName.functionName(?,?,?)}</procedure>这里参数p0标识调用过程的返回结果。第三类,有使用游标的的过程访问配置样式:<resultMap id=”resultMap” class=”package.ClassA”> <result property=”property0″ column=”field0″ /><result property=”property1″ column=”field2″ /><result property=”property2″ column=”field3″ /></resultMap><parameterMap id=”functionParamsMap” class=”map”><parameter property=”p0″ jdbcType=” INTEGER” javaType=”string” mode=”OUT”/><parameter property=”p1″ jdbcType=”VARCHAR” javaType=”string” mode=”IN”/><parameter property=”p2″ jdbcType=”INTEGER” javaType=”int” mode=”IN”/><parameter property=”p3″ jdbcType=”ORACLECURSOR” javaType=”java.sql.ResultSet” mode=”OUT” resultMap=”resultMap” /></parameterMap><procedure id=”statementId” parameterMap=”functionPramsMap”>{?=call packageName.functionName(?,?,?)}</procedure>这里,关键注意的是p3参数,由于使用的是oracle数据库驱动,所以用jdbcType=”ORACLECURSOR”表示oracle游标,同时由于是游标,所以javaType=”java.sql.ResultSet”。最后必须要给参数p3配置好resultMap属性,以说明游标返回的结果集映射方式,不配置此属性,在代码里来访问结果集是不行的。此时,在Java代码里调用的样式如下:HashMap<String, Object> params = new HashMap<String, Object>();params.put(”p1″, p1);params.put(”p2″, p2);sqlMapClient.queryForObject(”statementId”, params);List<ClassA> list = (List<ClassA>) params.get(”p3″);if (list != null && list.size() > 0) {return userList.get(0);}return null;第四类,有复杂的参数类型的存储过程:(1)、对于BLOB或者CLOB,在POJO里的属性都定义为byte[]类型,iBatis配置里跟普通类型参数一样处理;(2)、实现TypeHandler来自定义类型处理器用户处理复杂的字段;(3)、对于数据库自定义的数据类型,首先要定义实现了java.sql.SQLData的类Class TypeA。实现getSQLTypeName方法,返回值为数据库的自定义类型名。配置文件里parameter标签的属性如:jdbcType=”TypeB” JavaType=”TypeA”,同时还要写TypeHandlerCallback用于处理jdbcType=”TypeB”的类型。
解决方案五:
你可以在程序里面来调用存储
解决方案六:
SQL Map通过<procedure>元素支持存储过程。下面的例子说明如何使用具有输出参数的存储过程。<parameterMap id="swapParameters" class="map" ><parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/><parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/></parameterMap><procedure id="swapEmailAddresses" parameterMap="swapParameters" >{call swap_email_address (?, ?)}</procedure>调用上面的存储过程将同时互换两个字段(数据库表)和参数对象(Map)中的两个email地址。如果参数的mode属性设为INOUT或OUT,则参数对象的值被修改。否则保持不变。

时间: 2024-09-08 09:32:41

ibatis调用存储过程入参问题的相关文章

struts2+spring2.0+ibatis调用存储过程。

问题描述 我现在的做的项目是struts2+spring2.0+ibatis的,以前一直用Hibernate,对ibatis不熟.现在要频繁的调用一批存储过程.我有个问题,不理解.struts2+spring2.0+ibatis的系统,可以配置了既可以用ibatis又可以用jdbc吗我发觉jdbc调用存储过程比较简单,但是如果是在现有系统中不用spring的事务管理,自己在代码里写个链接jdbc的代码,很多存储过程要频繁打开,关闭连接,性能肯定不行.所以想问问,有什么方法,比如,ibatis直接

ibatis 调用存储过程返回游标

问题描述 如下:<resultMapid="P_OUTPUTPARAM_Map"class="java.util.HashMap"><resultproperty="noticeno"column="noticeno"/><resultproperty="resultcode"column="resultcode"/><resultpropert

jdbc调用存储过程问题

问题描述 从java调用存储过程,入参是数组的问题:java端:StructDescriptorsd=StructDescriptor.createDescriptor("WUTEST",con);Object[]nesta=newObject[]{null,null};STRUCTsnesta=newSTRUCT(sd,con,nesta);Object[]kisey=newObject[]{null,null};STRUCTskisey=newSTRUCT(sd,con,kisey

Mybatis调用PostgreSQL存储过程实现数组入参传递_PostgreSQL

前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: 复制代码 代码如下: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 如上所示,参数是一个int数组,Mybatis提供了对调用存储过程的支持,那么PostgreSQL独有的数组类型作为存储过程的参数又

关于调用webservice接口,出参入参用json格式

问题描述 关于调用webservice接口,出参入参用json格式 想写一个工具类,调用webservice接口,出参入参用json格式 解决方案 webservice 需要WSDL,里面包含了描述服务的xml的schema,http请求承载也是xml脚本.看你的意思是想用JSON替换XML?当然可以,但是后台如果是C++的业务处理,你需要建立json到c++的对象模型映射.

sringmvc-mybatis存储过程 根据入参返回不同数据集

问题描述 mybatis存储过程 根据入参返回不同数据集 我的存储过程根据参数,返回的游标每次都是不一样的,在mybatis xml配置文件里,resultMap只能设置,看到有人设置多个的,但是那样的话,是单次存储过程返回多个结果集,我这里要每次返回不同的结果集

ibatis调用Oracle中的存储过程和function

一.调用存储过程 Oracle代码 procedure proc_pos_check(p_gtin  in varchar2,                            p_safe_code   in varchar2,                            p_in_sell_id  in varchar2,                            p_buy_id      in varchar2,                        

在ASP.NET中调用存储过程方法新解

asp.net|存储过程 在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与

asp.net调用存储过程方法新解

asp.net|存储过程 在使用.net的过程中,数据库访问是一个很重要的部分,特别是在b/s系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用sql语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些sql语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与