Java中使用ibatis调用Oracle存储过程和函数

时间:2022-04-06 15:48:45


Hibernate等提供了全面的数据库封装机制的“全自动化”ORM 实现,“全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。
ibatis是“半自动化”,并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。比较灵活给程序员更多的发挥空间。

以下代码使用ibatis-sqlmap-2.jar,在Windows的Tomcat里测试通过,在Linux下的Weblogic里测试通过。

一、使用ibatis调用Oracle存储过程
1、创建测试存储过程,名称:TestPro

CREATE OR REPLACE PROCEDURE TestPro(myLevel IN VARCHAR2, myResult out  PLS_INTEGER) is

BEGIN
myResult:=0;
if myLevel = 'a' then
myResult:=0;
end if;

if myLevel = 'b' then
myResult:=-1;
end if;

if myLevel = 'c' then
myResult:=1;
end if;
END;

2、调用存储过程的SqlMap文件配置

<parameterMap id="testProParamMap" class="java.util.HashMap">
<parameter property="myLevel" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
<parameter property="myResult" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="OUT" />
</parameterMap>
<procedure id="testOraclePro" parameterMap="TestProParamMap">
{call TestPro(?,?)}
</procedure>

3、调用存储过程的DAO层代码

public Object TestProDao(Map map) {
return getSqlMapClientTemplate().queryForObject("ticket.testOraclePro", map);
}

4、前台调用

Map mapPro = new HashMap();
mapPro.put("myLevel", "b");
Object rs=xxxxDao.TestProDao(mapPro);
LogUtil.debug("rs="+rs);
LogUtil.debug("myResult="+mapPro.get("myResult"));

结果:
rs=null
myResult=-1
从测试结果看,返回结果是在Map里,输出参数作为键来访问取得

二、使用ibatis调用Oracle函数

1、创建测试函数,名称:TestFun

CREATE OR REPLACE FUNCTION TestFun(myLevel IN VARCHAR2)
RETURN NUMBER AS

myResult PLS_INTEGER := 0;

BEGIN
if myLevel = 'a' then
myResult:=0;
end if;

if myLevel = 'b' then
myResult:=-1;
end if;

if myLevel = 'c' then
myResult:=1;
end if;
return myResult;
END;
2、调用函数的SqlMap文件配置

<parameterMap id="testFunParamMap" class="java.util.HashMap">
<parameter property="myResult" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="OUT" />
<parameter property="myLevel" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
</parameterMap>
<procedure id="testOracleFun" parameterMap="TestFunParamMap">
{? = call TestFun(?)}
</procedure>
3、调用函数的DAO层代码

public Object TestFunDao(Map map) {
return getSqlMapClientTemplate().queryForObject("ticket.testOracleFun", map);
}
4、前台调用

Map mapFun = new HashMap();
mapFun.put("myLevel", "b");
Object rs=xxxxDao.TestProDao(mapFun);
LogUtil.debug("rs="+rs);
LogUtil.debug("myResult="+mapFun.get("myResult"))
结果:
rs=null
myResult=-1
从测试结果看,返回结果是在Map里,输出参数作为键来访问取得