时间:2021-07-01 10:21:17 帮助过:9人阅读
1.在数据库中创建以下的存储过程:
java代码:
2.编写SQL映射文件mapper.xml:
java代码:
3.编写JAVA代码调用存储过程
java代码:
4.执行Java代码,控制台输出结果如下:
java代码:
然后就有了mybatis-callable,获得方式如下:
?| 1 2 3 4 5 6 7 8 9 |
<dependencies>
...
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-callable</artifactId>
<version>1.0</version>
</dependency>
...
</dependencies>
|
配置是这样的:
?| 1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor"> </plugin>
</plugins>
</configuration>
|
创建一个查询,需要注意的是只有statementType为CALLABLE时拦截器才会起作用:
?| 1 2 3 4 5 6 7 8 9 |
<select id="query2" statementType="CALLABLE">
<![CDATA[
{call test_proc2(
#{acResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet, resultMap=hashMap},
#{userType},
#{branchCode}
)}
]]>
</select>
|
然后Dao或许是这样的,接口也是一样的:
?| 1 2 3 4 5 6 7 |
public List<Map<String, Object>> query2(String userType, String branchCode){
Map<String, Object> params = new HashMap<String, Object>();
params.put("userType",userType);
params.put("branchCode",branchCode);
//存储过程只返回一个游标,则使用selectList返回List
return getSqlSession().selectList("db.table.user.query2", params);
}
|
===========================================
返回单个参数但是不是游标的话就这样
?| 1 2 3 4 5 6 7 8 9 |
<select id="query3" statementType="CALLABLE">
<![CDATA[
{call test_proc3(
#{retCode,mode=OUT,jdbcType=INTEGER},
#{userType},
#{branchCode}
)}
]]>
</select>
|
?
| 1 2 3 4 5 6 7 |
public Integer query3(String userType, String branchCode){
Map<String, Object> params = new HashMap<String, Object>();
params.put("userType",userType);
params.put("branchCode",branchCode);
//存储过程只有一个返回值,并且不是游标,则使用selectOne
return getSqlSession().selectOne("db.table.user.query3", params);
}
|
===========================================
返回多个参数,里面啥都有:
?| 1 2 3 4 5 6 7 8 9 10 |
<select id="query" statementType="CALLABLE">
<![CDATA[
{call test_proc(
#{retCode,mode=OUT,jdbcType=INTEGER},
#{acResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet, resultMap=hashMap},
#{userType},
#{branchCode}
)}
]]>
</select>
|
?
| 1 2 3 4 5 6 7 |
public Map<String, Object> query(String userType, String branchCode){
Map<String, Object> params = new HashMap<String, Object>();
params.put("userType",userType);
params.put("branchCode",branchCode);
//存储过程只有一个返回值,并且不是游标,则使用selectOne
return getSqlSession().selectOne("db.table.user.query", params);
}
|
Map中包含所有存储过程输出的结果,Key是存储过程的参数名,按需来取就行了。
=============================================
上面看上去规则有点麻烦,其实用接口做的话就不用考虑是selectList还是selectOne了,直接接收返回值就可以。
=============================================
自己定义结果集的话参考一下SimpleResultHandler的实现就行了,反正把自己实现的按照下面这么配就行了。不配resultHandler的话默认就是SimpleResultHandler了。
?| 1 2 3 |
<plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor">
<property name="resultHandler" value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/>
</plugin>
|
完。
oracle存储过程入门
标签: