让Mybatis查询存储过程不那么另类
2014-05-21 16:11
106 查看
Mybatis默认查询存储过程的返回值是使用参数传来传去的,从参数里获取返回值总让我感觉怪怪的,特别是在使用接口做Dao的时候,破坏了Dao接口方法的统一性。
然后就有了mybatis-callable,获得方式如下:
配置是这样的:
创建一个查询,需要注意的是只有statementType为CALLABLE时拦截器才会起作用:
然后Dao或许是这样的,接口也是一样的:
===========================================
返回单个参数但是不是游标的话就这样
===========================================
返回多个参数,里面啥都有:
Map中包含所有存储过程输出的结果,Key是存储过程的参数名,按需来取就行了。
=============================================
上面看上去规则有点麻烦,其实用接口做的话就不用考虑是selectList还是selectOne了,直接接收返回值就可以。
=============================================
自己定义结果集的话参考一下SimpleResultHandler的实现就行了,反正把自己实现的按照下面这么配就行了。不配resultHandler的话默认就是SimpleResultHandler了。
完。
然后就有了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是存储过程的参数名,按需来取就行了。
=============================================
上面看上去规则有点麻烦,其实用接口做的话就不用考虑是selectList还是selectOne了,直接接收返回值就可以。
=============================================
自己定义结果集的话参考一下SimpleResultHandler的实现就行了,反正把自己实现的按照下面这么配就行了。不配resultHandler的话默认就是SimpleResultHandler了。
<plugin interceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor"> <property name="resultHandler" value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/> </plugin>
完。
相关文章推荐
- MyBatis,MySql存储过程分页查询
- Mybatis应用mysql存储过程查询数据
- 存储过程之查询的另类写法
- mybatis mysql 关于调用存储过程获取查询结果
- Mybatis应用mysql存储过程查询数据实例
- 通用存储过程之三:根据主键的值,查询记录的存储过程
- ASP.NET中利用存储过程实现模糊查询
- ASP.NET中利用存储过程实现模糊查询
- 疑问:关于组合查询时候的方法实现?能在存储过程中综合一下吗?
- 分页查询的存储过程
- 查询预警中的一个较为复杂的存储过程--dhg
- ASP.NET中利用存储过程实现模糊查询
- 我的一个“交叉表”查询存储过程
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- ASP.NET中利用存储过程实现模糊查询
- 请问视图是否可以像存储过程那样带参数进行查询
- ASP.NET中利用存储过程实现模糊查询
- 通用分页显示查询存储过程(献给朋友们)
- 通用分页显示查询存储过程(献给朋友们)
- ASP.NET中利用存储过程实现模糊查询