ibatis2.0使用procedure

之前的公司是互联网基本上会规避procedure这种东西,有的话也会是比较简单的实现.到了新公司全部使用procedure(原因不详,个人觉得是拍脑袋决定).ibatis2 2.1.7.597版本中的dtd有bug,会直接导致无法识别parameterMap标签下子标签resultMap!而是用比较高的版本会有jdbcType="ORACLECURSOR"无法支持的情况!后来发现使用2.3.4.726版本问题解决!
开发过程中引起的异常:
Check the output parameters (retrieval of output parameters failed)等类似异常,这个异常是把上面jdbcType="ORACLECURSOR"改为jdbcType="CURSOR"导致。主要的问题点1.dtd文件的不支持 2.对oracle cursor的支持bug!!
相关的资源:
http://www.alisdn.com/wordpress/?p=1362
http://www.apachebookstore.com/confluence/oss/display/IBATIS/How+do+I+call+a+stored+procedure?decorator=printable
相关配置如下:

		<dependency>
		  <groupId>org.apache.ibatis</groupId>
		  <artifactId>ibatis-sqlmap</artifactId>
		  <version>2.3.4.726</version>
		</dependency>

		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.9</version>
		</dependency>

		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc14</artifactId>
			<version>10.2.0.4.0</version>
		</dependency>

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <properties resource ="db.properties"/>
    <transactionManager type ="JDBC">
        <dataSource type="DBCP">
            <property  name = "JDBC.Driver"  value ="${driver}"/>
            <property  name = "JDBC.ConnectionURL"  value ="${url}" />
            <property  name = "JDBC.Username"  value = "${user}" />
            <property  name = "JDBC.Password"  value = "${password}" />
            <property  name = "Pool.MaximumWait"  value ="30000" />
		    <property  name = "Pool.MaximumActiveConnections" value = "15" />
		    <property  name = "Pool.MaximumIdleConnections" value = "15" />
        </dataSource>
    </transactionManager>
    <sqlMap resource="com/ssc/gce/biz/bean/RecDataSqlMapper.xml" />
</sqlMapConfig>

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE sqlMap
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="RecData">

	<typeAlias alias="BaseRecData" type="com.ssc.gce.biz.bean.BaseRecData" />

	<resultMap id="rec_result" class="BaseRecData">
	   <result property="guid" column="guid"/>
	   <result property="paymenttype" column="paymenttype"/>
	   <result property="amount" column="amount"/>
	   <result property="payOrReceive" column="payorreceive"/> 
	   <result property="effectiveDate" column="effectivedate"/>
	   <result property="valueDate" column="valueDate"/>
	   <result property="tradeId" column="tradeid"/>
	   <result property="assetId" column="assetid"/>
	   <result property="assetDescription" column="assetdescription" />
	   <result property="sourceId" column="sourceid"/>
	   <result property="postDate" column="postdate"/>
	   <result property="transactioncode" column="transactioncode"/>
	   <result property="classCode" column="classcode"/>
	   <result property="fundNumber" column="fund_number"/>
	   <result property="broker" column="broker"/>
	   <result property="account" column="account"/>
   </resultMap>
   
	<parameterMap id="rec_data_query" class="java.util.HashMap"> 
         <parameter property="guid" jdbcType="VARCHAR" mode="IN" />
		 <parameter property="sourceId" jdbcType="VARCHAR" mode="IN" />
		 <parameter property="fundNumber" jdbcType="VARCHAR" mode="IN" />
		 <parameter property="settlementDate" jdbcType="DATE" mode="IN" />
		 <parameter property="paymentType" jdbcType="VARCHAR" mode="IN" />
		 <parameter property="amount" jdbcType="DOUBLE" mode="IN" />
		 <!--out result  -->
		 <parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT"  resultMap="rec_result" />
    </parameterMap>
   
    <procedure id="RecDataDao.getRecData" parameterMap="rec_data_query" >
   		{call gc_getdata_pkg.getdata_uc1_prc(?,?,?,?,?,?,?)}
    </procedure>
   
</sqlMap>

 

public class IbatisRecDataDao extends MyIbatisClient implements RecDataDao {
	
	private static Logger logger = Logger.getLogger(IbatisRecDataDao.class);

	public List<BaseRecData> getRecData(RecDataQuery query) {
		try {

			Map<String, Object> queryMap = new HashMap<String, Object>();
			
			queryMap.put("guid",query.getGuid());
			queryMap.put("sourceId",query.getSourceId());
			queryMap.put("fundNumber",query.getFundNumber());
			queryMap.put("settlementDate",query.getSettlementDate());
			queryMap.put("paymentType",query.getPaymentType());
			queryMap.put("amount",query.getAmount());
//			queryMap.put("result",query.getResult());
//			sqlClient.queryForList("RecDataDao.getRecData", queryMap);
			sqlClient.queryForObject("RecDataDao.getRecData", queryMap);  
			return (List<BaseRecData>)queryMap.get("result");
		} catch (Exception e) {
			logger.error("IbatisRecDataDao.getRecData",e);
		}
		return null;
	}

}

 

create or replace
PACKAGE         gc_getdata_pkg
AS
  TYPE rec_Data IS RECORD
  (
     guid                     fpml_cash.guid%TYPE,
     paymenttype              paymenttoaccount.paymenttype%TYPE,
     amount                   paymenttoaccount.amount%TYPE,
     payorreceive             paymenttoaccount.payorreceive%TYPE,
     effectivedate            tradedetails.effectivedate%TYPE,
     valueDate                tradedetails.settlementdate%TYPE,
     tradeid                  versionedtransactionid.transactionid%TYPE,
     assetid                  tradedetails.assetid%TYPE,
     assetdescription         tradedetails.assetdescription%TYPE,
     sourceid                 fpml_cash.sourceid%TYPE, 
     postdate                 tradedetails.tradedate%TYPE,
     transactioncode          tradedetails.transactiontype%TYPE,
     classcode                VARCHAR2(100),
     fund_number              party.partyid%TYPE,
     broker                   party.partyid%TYPE,
     account                  party.partyid%TYPE
  );
  
  TYPE refcur IS REF CURSOR RETURN rec_Data; 

  /*****************************************************************************************
  name: getdata_uc1_prc
  parameters:     pn_guid             IN   NUMBER,
                  pn_sourceid         IN   NUMBER,
                  pn_partyid          IN   NUMBER,
                  pd_settlementdate   IN   DATE,
                  pv_paymenttype      IN   VARCHAR2,
                  pn_amount           IN   NUMBER,
                  cur_data            OUT  refcur
  create date: 2011-05-24
  creater: ×××
  desc: This procedure is to get the data via the input conditions
        The input parametes can be generated together with any condition
        For instance: call getdate_uc1_prc(2870112, null, null, null, null, null, curOut);
                   or call getdate_uc1_prc(null, 1, 'PC1E', null, null, null, curOut);
  *****************************************************************************************/
  PROCEDURE getdata_uc1_prc
  (
    pv_guid             IN   VARCHAR2,
    pv_sourceid         IN   VARCHAR2,
    pv_fund_number      IN   VARCHAR2,
    pd_settlementdate   IN   DATE,
    pv_paymenttype      IN   VARCHAR2,
    pn_amount           IN   NUMBER,
    
    cur_data            OUT  refcur
  );

  PROCEDURE getTestData_prc
  (
    pv_startNum       IN   VARCHAR2,
    pv_endNum         IN   VARCHAR2,
    cur_data          OUT  refcur
  );

  PROCEDURE getTestData_prc
  (
    cur_data          OUT  refcur
  );
  
END gc_getdata_pkg;

 

访问存储过程(或函数)一般以procedure标签来定义statement。 1)、访问存储过程(或函数)一般以procedure标签来定义statement。 (2)、输入输出的参数需要用parameterMap标签单独定义。 (3)、区分输入输出参数用parameter标签的mode属性来定义,分别为”OUT”和”IN”。 立即下载

相关推荐

IBATIS调用存储过程

IBATIS调用存储过程

ibatis 中调用存储过程

存储过程的概念:               存储过程是数据库将一组完成特定功能的Sql语句进行编译,每次调用时不必重新编译,因此执行速度和效率都比直接使用Sql语句有很大优势。在Ibatis中通过&lt;procedure&gt;标签元素可以直接调用数据库的存储过程,其实现过程如下: (1).定义存储过程所需输入/输出参数,如:       1 2 3 4 ...

毛兔记录:工作小技巧、遇到的一些典型bug、问题汇总、小知识。 550

iBATIS动态标签

iBATIS动态标签 §<dynamic>标签 §二元标签 §一元标签 §<iterate>标签 § 共同的属性 prepend,open,close <dynamic>标签 §<dynamic>标签 §属性 prepend,open,close 二元条件标签

iBatis procedure

一、创建procedure(mysql)

jjavaboy的专栏 2675

ibatis 错误

ibatis调用存储过程的时候报错,但是java代码逻辑都正常 --- Check the output parameters (retrieval of output parameters failed).   --- Cause: java.sql.SQLException: ORA-08103: 对象不再存在 错误原因:事务可能没提交

七两雨 1881

ibatis配置oracle存储过程返回cursor类型

今天在开发中,需要用到存储过程返回多条记录,用到了cursor.于早上网查找有关ibatis配置cursor的文章,大多数的文章代码只提到了关键部分,于是拿来安到自己的项目上,花了一下午的时间来调试,总是报错总结了以下出现过的错误:1PLS-00306: 调用 P_HR_CUSTOMER_INFO 时参数个数或类型错误ORA-06550: 第 1 行, 第 7 列:PL/SQL: Statem

meteor_730的专栏 2743

iBatis简单介绍

1.Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate、Toplink等在java编程的对象持久化方面深受开发人员欢迎。 对象关系映射(ORM):简单原理是通过面向对象方式操作关系型数据库,目前存储数据最常用最流行的工具是关系型数据库,其操作方式是通过 SQL语句操作数据库的表,但是对于Java面向对象编程语言中,所有的...

weixin_34376986的博客 1040

ibatis procedure

Solution 1 This is sample mapping for a Stored procedure which return Ref cursor in it's out parameter &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;!DOCTYPE sqlMap PUBLIC "-//ibatis.a...

lanapple123的专栏 429

Ibatis 中怎样使用 Oracle Ref Cursor

Release 2.2.0 of iBATIS DataMapper natively supports Oracle REF Cursors - without the need to create a custom type handler. This FAQ shows a very small example on how to use it.We start with the (Or

hynet的专栏 1259

IBATISprocedure传入自定义类型

Java端有Class TypeA的某类型,现在需要把它作为参数,传给后台oracle数据库的一个procedure,而数据库端也定义了与此类同样结构的自定义TypeB。步骤: 1. 定义实现了java.sql.SQLData的类Class TypeA。实现getSQLTypeName方法,返回值为数据库的自定义类型名。实现readSQL 方法时要注意,读sql字段的顺序要与Class Typ

Project Architect的专栏 1765

ibatis3.0存储过存的一些细节。

1.因为支持注释和代码方式生成mapper,所以原来的  parameterMap反对使用,也就是不建议用parameter的顺序支对应"?" 方式的参数。   因为mapper的数据是一个纯xml的,而xml的元素如果没有标记为序列是没有顺序的,所以用    这样的顺序关系对应procedure(?,?)的参数是不可靠的。所以3.0直接使用#{p1},#{p2,otherAttribute.

诗剑书生的专栏 4475

ibatis学习

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <s...

ddak56357的博客 159

ibatis2.3调用oracle function

 这次做wap club的时候,由于要在ibatis里直接调用oracle的function,并取到返回值。就上网搜了一下,发现这样的实例很少,并且由于ibatis的版本不同,所以实现方式也不一样。经过不断的实验之后,实现了目标。现在将结果贴在下面,以缩减同学们找资料的时间。 1.sqlmap的配置:如果返回值是一个int时(我们很多存储过程都是这样的): <param

iinel的专栏 2702

ibatis禁用缓存

在最近的项目开发中遇到一个问题,前端传一个表名到后台。ibatis发起查询,ibatisxml如下 select * from $tableName$ 测试的过程中发现第一次传入的表名是T_CITY没有问题,日志如下 2015-01-29 13:53:41 [com.fullgold.dbdst.action.QueryTableRe

playleud的专栏 2932

ibatis mysql存储过程返回结果集,IBatis查删节查与调用存储过程 mysql数据库

IBatis查删改查与调用存储过程 mysql数据库简单介绍一下IBatis是什么:iBATIS一词来源于“internet”和“abatis”的组合,是一个由ClintonBegin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和DataAccessObjects(DAO),同时还提供一个利用...

weixin_31812189的博客 196

ibatis xml 调用存储过程案例

sqlMap>-- eg) }-->) }) }) }) }) }) }) }) }) }

m0_38061183的博客 869

ibatis mysql存储过程_iBATIS存储过程

使用iBATIS配置来调用存储过程。为了理解这一章,首先需要了解我们是如何在MySQL中创建一个存储过程。在继续对本章学习之前,可以通过MySQL存储过程。我们已经在MySQL下有EMPLOYEE表:CREATE TABLE EMPLOYEE(id INT NOT NULL auto_increment,first_name VARCHAR(20)defaultNULL,last_name VA...

weixin_34922053的博客 169

ibatis 调用存储过程(2

http://blog.csdn.net/fy_kenny/archive/2008/04/30/2350586.aspx   全部是针对Microsoft SQL Server 2000的Stored Procedure的例子:参照《iBATIS in Action》书写:1.   max_in_exampleStored Procedure:CREATE PROCEDURE [dbo].[...

maqianmaqian的专栏 152
上一篇: 一次性import ctrl+shift+O
下一篇: oracle block的PCTUSED,PCTFREE,freelist等(自己理解总结)
datamodule
博客等级 码龄21年 3粉丝 35原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值