iBatis(现在更名为myBatis了)可以被看做是一个"半自动化"的ORM工具(通过sql-mapper),或者更严格的说,是一个关于JDBC API的强大封装。简单易学是它的优点,这也就是为什么在很多项目中,我都倾向于使用iBatis,尤其是提供大量复杂查询或者报表功能的应用当中。
在<<iBatis in Action>>这本书中,讲解了关于iBatis的各种用法,但是作者也特别强调了:在Dataaccess这层上,通过调用存储过程是一个反模式,不推荐使用;于是关于通过iBatis调用存储过程,只是非常简单的一笔带过。
但是我们也通常会在很多场合中,遇到要使用存储过程的情况。就存储过程本身,以Oracle存储过程为例,我们完全可以在一个jdbc事务里面,完成有多个前后依赖步骤的较为复杂的数据库访问,从而减少应用与数据库之间的往返通讯。
在这里,以Oracle数据库为例,讲述通过iBatis调用Oracle存储过程时的配置思路。在这里我假定阅读此文的人有关于iBatis的使用经验,从而可以略过一些细节描述。
先看一下Oracle存储过程接口:
PROCEDURE r_process_order(is_oid IN VARCHAR2, -- 订单号
is_taskid in varchar2, --任务单号
is_price in number, --价格
is_gap in number, --浮动价差
is_notes in varchar2, --备注
is_timelimit in number, --报价有效时间限制
is_userid in varchar2, -- 用户编号
is_deptid in varchar2, -- 用户所在部门id
oi_flag OUT INTEGER, --0 成功 -1 错误
os_msg OUT VARCHAR2, --出错信息
os_finish out varchar2, --是否完成订单流程 0否 1是
or_order_item_list out sys_refcursor, -- 订单条目信息
or_task_item_list out sys_refcursor, -- 后续待办事项信息
or_userlist out sys_refcursor -- 广播通知的用户集
);
对应地,在ibatis的xml配置文件中,针对该存储过程调用的配置如下所述:
<!-- 订单:应答 -->
<parameterMap id="map_r_process_order" class="doRfqReply">
<parameter property="orderId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="taskId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="price" jdbcType="DOUBLE" javaType="java.math.BigDecimal" mode="IN" />
<parameter property="gap" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="notes" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="userId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="deptId" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="flag" jdbcType="INTEGER" javaType="int" mode="OUT" />
<parameter property="msg" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT" />
<parameter property="strFinish" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT" />
<parameter property="orderItemList" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT"
resultMap="orderItemListResult" />
<parameter property="taskItemList" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT"
resultMap="taskItemListResult" />
<parameter property="processUserIds" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT"
resultMap="processUserId" />
</parameterMap>
<procedure id="r_process_order" parameterMap="map_r_rfq_reply">
{ call p_foo_bar_manager.r_process_order(?,?,?,?,?,?,?,?,?,?,?,?,?)}
</procedure>
上面这段代码包含了两点,id为“map_r_process_order”声明了传入参数和Oracle存储过程接口参数之间的映射关系,按照顺序对应;
id为"r_process_order"执行存储过程调用。存储过程的IN参数类型和OUT参数类型,总数为13个,所以?号个数也是13,顺序对应。
Java代码在此处从略:基本上,较为简单的做法,就是针对IN和OUT类型,准备两个VO对象,分别包装存储过程的传入参数和传出参数。
传入参数属性结构较为简单。
传出参数,既包括基本类型例如flag(integer),msg(String),也包括了复合类型。在这里orderItemList表示我们期望存储过程以游标返回一个 List<OrderItem>结果集,指定jdbcType为ORACLECURSOR,iBatis会自动帮助我们完成ResultSet与POJO的数据绑定(这里的POJO是 OrderItem)。当然,在这里我们需要提供一个resultMap,来描述游标行集中的每一个行,与我们的OrderItem之间的映射关系。
分享到:
相关推荐
总结,ibatIS调用存储过程涉及了框架配置、Mapper接口设计、XML映射文件编写、Java代码实现等多个方面,理解这些知识点对于在实际项目中灵活运用ibatIS调用存储过程至关重要。通过熟练掌握这些技能,开发者可以更...
本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库中创建一个存储过程。以下是一个Oracle数据库中的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE pp ...
在Java开发中,iBATIS(现在被称为MyBatis)是一个流行的数据持久层框架,它允许开发者将SQL语句直接嵌入到Java代码中,从而简化数据库操作。...希望这个示例能帮助你更好地理解iBATIS调用存储过程的方法。
根据提供的文件信息,标题为“ibatis调用存储过程”,主要关注的是如何使用ibatis框架来调用数据库中的存储过程。下面将详细解释ibatis框架的基本概念、存储过程的概念以及如何在ibatis中配置和执行存储过程。 ### ...
### Ibatis调用存储过程详解 #### 一、引言 在实际的软件开发过程中,存储过程因其执行效率高及数据库级别的安全性等优点被广泛应用于各种业务场景之中。而对于使用Ibatis作为持久层框架的应用来说,如何有效地...
在IT领域,特别是数据库操作与Java开发中,利用ibatis框架调用...通过上述步骤,我们可以成功地使用ibatis调用Oracle存储过程,并处理返回的多个结果集。这不仅简化了数据库操作,还提高了代码的可读性和可维护性。
对于复杂场景,如多表联查、分页、存储过程等,你可以继续深入学习XML配置文件的高级用法,例如使用`<association>`, `<collection>`处理嵌套结果,使用`<resultMap>`定义复杂的映射关系等。 总的来说,iBATIS的XML...
本文将深入探讨如何使用iBatis调用存储过程并返回游标,这是一个在处理复杂数据库操作时常见的需求。 ### iBatis调用存储过程返回游标 #### 存储过程简介 存储过程是预先编译并存储在数据库中的SQL代码块,它可以...
"IBatis查删改查与调用存储过程 mysql数据库" 这个标题揭示了本文将深入探讨如何使用IBatis框架在MySQL数据库中执行基本的CRUD(创建、读取、更新、删除)操作,以及如何调用存储过程。IBatis是一个轻量级的Java持久...
调用存储过程: ```java Map, Object> params = new HashMap(); params.put("id", id); sqlSession.execute("updateEmployeeStatus", params); String status = (String) params.get("status"); ``` 5. **...
#### 使用Ibatis调用存储过程 Ibatis是一个Java持久层框架,它能够简化Java应用程序与数据库之间的交互。为了调用上述存储过程并正确处理返回值,我们需要进行以下配置: ##### 日志配置(log4j.properties) ```...
在实际项目中,使用Ibatis调用存储过程时,还应注意以下几点: 1. 不同的数据库系统可能有不同的存储过程调用语法,如Oracle、MySQL、SQL Server等,需要根据具体数据库进行调整。 2. 存储过程中的输出参数在Java...
在调用存储过程时,Ibatis允许开发者编写SQL语句或存储过程,然后在XML配置文件中定义这些操作,使得调用过程直观且易于维护。 Blazeds是一个Flash Remoting解决方案,主要用于Flex和Java之间的数据通信。通过...
在iBatis中,当存储过程返回一个游标时,你可以将其映射为一个Java List。为此,你需要在Java方法中声明一个List类型的参数,而在SQL映射文件中,使用`<resultMap>`定义一个结果集映射,然后在`<selectResult>`标签...
在调用存储过程时,我们需要配置IBatis的Mapper文件。Mapper文件定义了如何将Java对象与SQL语句或存储过程关联起来。在XML配置中,`<sqlMap>`元素包含了`<alias>`、`<parameterMaps>`和`<statements>`等子元素。以下...
本篇文章将深入探讨如何在Ibatis中实现增、删、查、改(CRUD)操作,并调用存储过程,同时涉及相关的表结构设计。 首先,Ibatis通过XML配置文件或注解方式定义了SQL语句,允许我们编写动态SQL,以适应不同的查询...
在iBatis的映射文件中,定义一个select标签来调用存储过程: ```xml {call your_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{result, mode=OUT, jdbcType=VARCHAR})} ``` 在DAO类中,使用...
学习这两份文档,开发者不仅可以理解iBATIS的基本工作原理,还能掌握如何高效地利用iBATIS调用存储过程,提高数据库操作的灵活性和性能。对于Java开发者,尤其是从事Web应用开发的人员,深入理解和熟练运用iBATIS是...
然后,他们会在iBatis的配置文件中定义这些存储过程的映射,以便在Action类中通过iBatis调用。 至于“ssi+mysql”标签,这里的“ssi”可能是指Struts、Spring和iBatis的首字母缩写,表明这个项目是基于这三个框架...