打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

然后就有了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>


完。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用mybatis执行oracle存储过程
mybatis调用存储过程
sign
oracle存储过程备忘以及在Hibernate中使用存储过程
教你写Http框架(二)——三个例子带你深入理解AsyncTask
MyBatis多参数传递之Map方式示例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服