调用Oracle存储过程,可能返回多个结果,也可能包含多个结果集直接上代码 /**************Mapping配置************/ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "http:///dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jyd.trace.dao.TraceMapper"> <resultMap type="com.jyd.trace.pojo.ProcTestOut" id="procTestValue"> <result column="pi_p3" property="pi_p3" /> <result column="pi_p4" property="pi_p4" /> <result column="pi_p5" property="pi_p5" /> </resultMap> <resultMap type="com.jyd.trace.pojo.Dual" id="dualMap"> <result column="dummy" property="dummy" /> </resultMap> <resultMap type="com.jyd.trace.pojo.ProcTestOut" id="procTestOutMap"> <result column="idx" property="idx" /> <result column="username" property="username" /> <result column="curdate" property="curdate" /> </resultMap> <select id="procedureTest" statementType="CALLABLE" parameterType="Map"> {call p_test(#{pi_p1,mode=IN,jdbcType=VARCHAR}, #{pi_p2,mode=IN,jdbcType=VARCHAR}, #{pi_p3,mode=OUT,jdbcType=DOUBLE}, #{pi_p4,mode=OUT,jdbcType=VARCHAR}, #{pi_p5,mode=OUT,jdbcType=VARCHAR}, #{pi_p6,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=dualMap}, #{pi_p7,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=dualMap}, #{pi_p8,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=procTestOutMap} )} </select> </mapper> /**************Dao定义************/ public interface TraceMapper { void procedureTest(Map<String, Object> paramMap); } /**************Service调用部分************/ @Service("traceService") public class TraceService { @Resource TraceMapper traceMapper; private static Logger logger= Logger.getLogger(TestMyBatis.class); public Map<String, Object> procedureTest(){ Map<String, Object> paramMap= new HashMap<String, Object>(); paramMap.put("pi_p1", "第一个值"); paramMap.put("pi_p2", "值2"); traceMapper.procedureTest(paramMap); return paramMap; } } /**************JUnit测试************/ public class TestMyBatis { private static Logger logger= Logger.getLogger(TestMyBatis.class); @Resource TraceService traceService=null; @Test public void test(){ logger.info("这是一个测试信息"); Map<String, Object> result= traceService.procedureTest(); logger.info("result:"+ String.valueOf(result.size())); logger.info("pi_p5:"+String.valueOf(result.get("pi_p5"))); /*List<Dual> duals= (List<Dual>)result.get("pi_p6"); logger.info("duals.size():"+ String.valueOf(duals.size())); if (duals.size()>0){ logger.info("duals_0:"+ duals.get(0).getDummy()); }*/ List<ProcTestOut> procTTO= (List<ProcTestOut>)result.get("pi_p8"); logger.info("LIST:"+String.valueOf(procTTO.size())); for (ProcTestOut p:procTTO){ logger.info("-->:"+p.toString()); } } } /**************POJO部分省略************/ /*********************以下为原始参考部分***************************/ 在我们项目中有用到存储过程,并且是存储过程调用存储过程,存储过程调用函数,然后在存储过程中插入日志。使用存储过程的优缺点: 1.以后出现业务上的变更,直接修改存储过程,而不用动项目,需求已经了解清楚,传递进来的参数已经不会改变, 存储过程对于数据库的依赖太强了,提高了项目与数据库之间的耦合度,如果项目一旦换了数据库,那所有存储过程将重写。 1.这里我是直接接我下面的这个地址写的:http://blog.csdn.net/shen525758203/article/details/32331229 2.创建存储过程如下: CREATE OR REPLACE PROCEDURE user_selectList(p_age in INTEGER, p_CURSOR out sys_refcursor) ISBEGIN OPEN p_CURSOR FOR SELECT * FROM TB_USER where age = p_age; END user_selectList; 这里也可以创建包体,执行存储过程在命令窗体中执行。 3.在TUserBasicMapper.xml中添加如下信息:
4.在TUserBasicMapper中添加如下方法: Map<String, Object> execProcedure(Map<String, Object> param); 5.在UserTest中添加如下测试: @Test public void proc(){ Map<String, Object> paramter= new HashMap<String, Object>(); paramter.put("age", 22); tUserBasicMapper.execProcedure(paramter); List list = (List) paramter.get("p_CURSOR"); System.out.println(list.size()); } 控制信息如下: |
|