1.在数据库中创建以下的存储过程:
java代码:
- create or replace procedure pro_hello(p_user_name in varchar2,p_result out varchar2) is
- begin
- p_result := ‘hello,‘ || p_user_name;
- end;
2.编写SQL映射文件mapper.xml:
java代码:
- <select id="proHello" statementType="CALLABLE">
- <![CDATA[
- {call pro_hello (#{p_user_name,mode=IN,jdbcType=VARCHAR},#{result,mode=OUT,jdbcType=VARCHAR})}
- ]]>
- </select>
3.编写JAVA代码调用存储过程
java代码:
- public class ProcedureTest {
- public static void main(String[] args) throws IOException {
- String resource = "mybatis.cfg.xml";
- Reader reader = Resources.getResourceAsReader(resource);
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
- SqlSession session = ssf.openSession();
- try {
- Map<String, String> param = new HashMap<String, String>();
- param.put("p_user_name", "zhangsan");
- String returnValue = (String) session.selectOne("User.proHello", param);
- System.out.println("message=" + param.get("p_user_name"));
- System.out.println("result=" + param.get("result"));
- System.out.println("returnValue=" + returnValue);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- session.close();
- }
- }
- }
4.执行Java代码,控制台输出结果如下:
java代码:
- 2012-03-07 20:36:32,406 DEBUG [java.sql.PreparedStatement] -==> Executing: {call pro_hello(?,?)}
- 2012-03-07 20:36:32,406 DEBUG [java.sql.PreparedStatement] -==> Parameters: zhangsan(String)
- message=zhangsan
- (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 <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN""http://ibatis.apache.org/dtd/ibatis-3-config.dtd"><configuration><plugins><plugininterceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor"> </plugin></plugins></configuration>创建一个查询,需要注意的是只有statementType为CALLABLE时拦截器才会起作用:
?1 2 3 4 5 6 7 8 9 <selectid="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返回Listreturn getSqlSession().selectList("db.table.user.query2", params);}===========================================
返回单个参数但是不是游标的话就这样
?1 2 3 4 5 6 7 8 9 <selectid="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);//存储过程只有一个返回值,并且不是游标,则使用selectOnereturn getSqlSession().selectOne("db.table.user.query3", params);}===========================================
返回多个参数,里面啥都有:
?1 2 3 4 5 6 7 8 9 10 <selectid="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);//存储过程只有一个返回值,并且不是游标,则使用selectOnereturn getSqlSession().selectOne("db.table.user.query", params);}Map中包含所有存储过程输出的结果,Key是存储过程的参数名,按需来取就行了。
=============================================
上面看上去规则有点麻烦,其实用接口做的话就不用考虑是selectList还是selectOne了,直接接收返回值就可以。
=============================================
自己定义结果集的话参考一下SimpleResultHandler的实现就行了,反正把自己实现的按照下面这么配就行了。不配resultHandler的话默认就是SimpleResultHandler了。
?1 2 3 <plugininterceptor="com.github.miemiedev.mybatis.callable.CallableConvertInterceptor"><propertyname="resultHandler"value="com.github.miemiedev.mybatis.callable.handler.SimpleResultHandler"/></plugin>完。
oracle存储过程入门
标签:
本文系统来源:http://www.cnblogs.com/leo3689/p/4576990.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!