|
Mybatis默認(rèn)查詢存儲(chǔ)過程的返回值是使用參數(shù)傳來(lái)傳去的,從參數(shù)里獲取返回值總讓我感覺怪怪的,特別是在使用接口做Dao的時(shí)候,破壞了Dao接口方法的統(tǒng)一性。
然后就有了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.//DTD Config 3.0//EN"
"http://ibatis./dtd/ibatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor"> </plugin>
</plugins>
</configuration>
|
創(chuàng)建一個(gè)查詢,需要注意的是只有statementType為CALLABLE時(shí)攔截器才會(huì)起作用:
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);
//存儲(chǔ)過程只返回一個(gè)游標(biāo),則使用selectList返回List
return getSqlSession().selectList("db.table.user.query2", params);
}
|
===========================================
返回單個(gè)參數(shù)但是不是游標(biāo)的話就這樣
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);
//存儲(chǔ)過程只有一個(gè)返回值,并且不是游標(biāo),則使用selectOne
return getSqlSession().selectOne("db.table.user.query3", params);
}
|
===========================================
返回多個(gè)參數(shù),里面啥都有:
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);
//存儲(chǔ)過程只有一個(gè)返回值,并且不是游標(biāo),則使用selectOne
return getSqlSession().selectOne("db.table.user.query", params);
}
|
Map中包含所有存儲(chǔ)過程輸出的結(jié)果,Key是存儲(chǔ)過程的參數(shù)名,按需來(lái)取就行了。
=============================================
上面看上去規(guī)則有點(diǎn)麻煩,其實(shí)用接口做的話就不用考慮是selectList還是selectOne了,直接接收返回值就可以。
=============================================
自己定義結(jié)果集的話參考一下SimpleResultHandler的實(shí)現(xiàn)就行了,反正把自己實(shí)現(xiàn)的按照下面這么配就行了。不配resultHandler的話默認(rèn)就是SimpleResultHandler了。
1 2 3 | <plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor">
<property name="resultHandler" value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/>
</plugin>
|
完。
|