让Mybatis查询存储过程不那么另类

jopen 10年前

Mybatis默认查询存储过程的返回值是使用参数传来传去的,从参数里获取返回值总让我感觉怪怪的,特别是在使用接口做Dao的时候,破坏了Dao接口方法的统一性。

然后就有了mybatis-callable,获得方式如下:

<dependencies>    ...      <dependency>          <groupId>com.github.miemiedev</groupId>          <artifactId>mybatis-callable</artifactId>          <version>1.0</version>      </dependency>   ...  </dependencies>

 

配置是这样的:

<?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时拦截器才会起作用:

<select id="query2" statementType="CALLABLE">      <![CDATA[          {call test_proc2(              #{acResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet, resultMap=hashMap},              #{userType},              #{branchCode}          )}      ]]>  </select>

然后Dao或许是这样的,接口也是一样的:

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);  }

===========================================

返回单个参数但是不是游标的话就这样

<select id="query3" statementType="CALLABLE">      <![CDATA[          {call test_proc3(              #{retCode,mode=OUT,jdbcType=INTEGER},              #{userType},              #{branchCode}          )}      ]]>  </select>
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);  }

===========================================

返回多个参数,里面啥都有:

<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>
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是存储过程的参数名,按需来取就行了。

=============================================

自己定义结果集的话参考一下SimpleResultHandler的实现就行了,反正把自己实现的按照下面这么配就行了。不配resultHandler的话默认就是SimpleResultHandler了。

<plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor">      <property name="resultHandler" value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/>  </plugin>

 

完。
来自:http://my.oschina.net/miemiedev/blog/267432