http://www.360doc.com/content/14/0728/16/7662927_397682668.shtml
如何使用Mybaits調用數據庫中的存儲過程,下面以Oracle數據庫的為例:
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 7public 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
>
完。