mybatis调用存储过程

[sql]  view plain  copy
  1. CREATE OR REPLACE PROCEDURE "SP_MF_I_IMP"  
  2.           ( I_MANIFEST_I_ID    IN NUMBER ,  
  3.             I_FUNCTION_CODE  IN VARCHAR2,  
  4.             I_FIRM_ID        IN NUMBER,  
  5.             I_OP_USER        IN VARCHAR2, --操作人ID  
  6.             O_RETURN_MESSAGE OUT VARCHAR2  ) AS  
  7.   
  8.           --根据SEQ生成的报文头表的ID  
  9.           V_HEAD_INFO_ID NUMBER(11);  
  10.           --报文编号中,年月日时生成  
  11.           V_YYMMDDHHMM VARCHAR2(10);  
  12.           --报文编号  
  13.           V_MESSAGE_ID VARCHAR2(50);  
  14.           --申报人  
  15.           V_SEND_ID VARCHAR2(50);  
  16.           --货物运输批次号  
  17.           V_TRAN_NO VARCHAR2(13);  
  18.           --提运单号  
  19.           V_BILL_NO VARCHAR2(35);  
  20.           --异常报文  
  21.           STR_L_ERRMSG VARCHAR2(3000);  
  22.           --新增,修改,删除类型  
  23.           V_FUNTYPE VARCHAR2(5);  
  24.           --是否已经申报的标识  
  25.           V_DECLARE VARCHAR(5);  
  26.             
  27.           BEGIN   
  28.             
  29.             --当要申报的单的状态为‘001’新单,‘008’发送海关失败时才需要发送  
  30.             IF V_DECLARE = '001' OR V_DECLARE = '008' THEN  
  31.                 --获得SEQ_EDI_HEAD_INFO的值  
  32.                 SELECT EDI.SEQ_EDI_HEAD_INFO.NEXTVAL INTO V_HEAD_INFO_ID FROM DUAL;  
  33.                 --组装生成报文编号中的'YYMMDDHHMM'  
  34.                 SELECT TO_CHAR(SYSDATE,'YYMMDDHH24MI'INTO V_YYMMDDHHMM FROM DUAL;  
  35.                 --生成报文编号  
  36.                 V_MESSAGE_ID := '78921227X'|| V_YYMMDDHHMM || I_MANIFEST_I_ID;  
  37.   
  38.                 --通过GET_SEND_ID函数获取SENDID  
  39.                 V_SEND_ID := GET_SEND_ID(I_FIRM_ID);  
  40.   
  41.                 --新增报文头表信息  
  42.                 INSERT INTO EDI.EDI_MANIFEST_I_HEAD_INFO  
  43.                   (ID,MESSAGE_ID,FUNCTION_CODE,MESSAGE_TYPE,SENDER_ID,RECEIVER_ID,VERSION,IMP_ID)  
  44.                 VALUES  
  45.                   (V_HEAD_INFO_ID,V_MESSAGE_ID,I_FUNCTION_CODE,'MT1401',V_SEND_ID,'EPORT','1.0',I_MANIFEST_I_ID);  
  46.   
  47.                
  48.                   O_RETURN_MESSAGE := 'success';  
  49.                   --写入LOG表  
  50.                   SP_TRACE_WRITE(V_FUNTYPE, V_TRAN_NO, V_BILL_NO, I_OP_USER, '004', STR_L_ERRMSG, O_RETURN_MESSAGE);  
  51.   
  52.                  END;  
  53.               ELSE ---表示没有对应的申报类型,事物回滚,写入异常日志  
  54.                 O_RETURN_MESSAGE := 'error';  
  55.                 RAISE_APPLICATION_ERROR(-20100, 'Invalid Registration');  
  56.               END IF;    
  57.               COMMIT;  
  58.               
  59.         --异常处理  
  60.         EXCEPTION  
  61.         WHEN   OTHERS   THEN  
  62.   
  63.             STR_L_ERRMSG := SQLCODE || ' ' || SQLERRM;  
  64.             ROLLBACK ;  --异常处理,异常点上面的操作都不会被执行  
  65.   
  66.             O_RETURN_MESSAGE := 'error';  
  67.             SP_TRACE_WRITE(V_FUNTYPE, V_TRAN_NO, V_BILL_NO, I_OP_USER, '005', STR_L_ERRMSG, O_RETURN_MESSAGE);  
  68.             COMMIT;  
  69.     END SP_MF_I_IMP;  
中间加入了异常处理,出现异常要回滚并且写入日志表,同时返回显示是否成功的标识。

如下是在mybatis配置如下:

[html]  view plain  copy
  1. <parameterMap id="sendMap" type="java.util.HashMap">    
  2.     <parameter property="I_MANIFEST_I_ID" jdbcType="NUMERIC" javaType="java.lang.Long" mode="IN"/>    
  3.     <parameter property="I_FUNCTION_CODE" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>    
  4.     <parameter property="I_FIRM_ID" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="IN"/>    
  5.     <parameter property="I_OP_USER" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>  
  6.     <parameter property="O_RETURN_MESSAGE" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>    
  7. </parameterMap>  
  8.   
  9. <update id="sendManifstmanToEdi" parameterMap="sendMap" statementType="CALLABLE">  
  10.     <![CDATA[ 
  11.         {call SP_MF_I_IMP(?, ?, ?, ?, ?)}   
  12.     ]]>  
  13. </update>    

存储过程中都有IN,OUT的参数,创建一个<parameterMap>列出你要向存储过程传递的参数与获取的返回值。因为这边会有更新数据字段的设置,所以这边用的是<update>,再在后台之后代码的设值、调用、获取返回值如下:

[java]  view plain  copy
  1. private String sendEdi(Long id) throws Exception {  
  2.     String result = "";  
  3.     Map<String,Object> params = new HashMap<String, Object>();  
  4.     try {  
  5.         params.put("I_MANIFEST_I_ID", id);   
  6.         params.put("I_FUNCTION_CODE", Constants.MAINIFEST_DECLARE);   
  7.         params.put("I_FIRM_ID", getFirmOfLoginUser().getFirmId());   
  8.         params.put("I_OP_USER", getLoginUser().getLoginName());  
  9.         params.put("O_RETURN_MESSAGE""");  
  10.         manifestIMainService.sendManifstmanToEdi(params);  
  11.         result = String.valueOf(params.get("O_RETURN_MESSAGE"));  
  12.     } catch (Exception e) {  
  13.         log.error("sendEdi occurred error.", e);  
  14.         if(Constants.IS_TEST)  
  15.             setErrorMsg(e.getMessage());  
  16.     }  
  17.     return result;  
  18. }  

二、返回SYS_REFCURSOR,我们取出将其对应成为一个List,写在<parameterMap>里面,存储过程如下:

[sql]  view plain  copy
  1. CREATE OR REPLACE PROCEDURE "SP_TRACE_GET"(I_DATA_TYPE IN CHAR,   
  2.                                          I_TRAN_NO   IN VARCHAR2,   
  3.                                          I_BILL_NO   IN VARCHAR2,   
  4.                                          O_LIST      OUT SYS_REFCURSOR) AS  
  5.   CURSOR_VALUE SYS_REFCURSOR;  
  6.   
  7. BEGIN  
  8.   CASE  
  9.     WHEN I_DATA_TYPE = 'I' THEN  
  10.       BEGIN  
  11.         OPEN CURSOR_VALUE FOR  
  12.       SELECT A.*  
  13.           FROM MANIFEST_I_LOG A  
  14.          WHERE A.TRAN_NO = I_TRAN_NO  
  15.            AND A.BILL_NO = I_BILL_NO;  
  16.        EXCEPTION  
  17.          WHEN no_data_found THEN  
  18.               RETURN;  
  19.       END;  
  20.       BEGIN  
  21.       OPEN CURSOR_VALUE FOR  
  22.        SELECT T.* FROM(  
  23.         SELECT A.*  
  24.           FROM MANIFEST_I_LOG A  
  25.          WHERE A.TRAN_NO = I_TRAN_NO  
  26.            AND A.BILL_NO = I_BILL_NO  
  27.         UNION ALL  
  28.         SELECT B.*  
  29.           FROM BINDING_L_LOG B  
  30.          WHERE B.TRAN_NO = I_TRAN_NO  
  31.         UNION ALL  
  32.         SELECT C.* FROM LOADCHANG_LOG C WHERE C.TRAN_NO = I_TRAN_NO)T ORDER BY T.OP_TIME DESC;  
  33.         END;  
  34.     WHEN I_DATA_TYPE = 'C' THEN  
  35.       OPEN CURSOR_VALUE FOR  
  36.         SELECT * FROM LOADCHANG_LOG WHERE TRAN_NO = I_TRAN_NO ORDER BY OP_TIME DESC;  
  37.   END CASE;  
  38.   O_LIST := CURSOR_VALUE;  
  39. END SP_TRACE_GET;  
返回查询出来的结果,在mybatis的配置文件中可以跟上面一种不一样的方式来写,配置如下:

[sql]  view plain  copy
  1. <!-- 结果集映射 -->  
  2. <resultMap id="flowLogsResultMap" type="com.hwt.glmf.log.vo.FlowLogModel">  
  3.     <result column="ID" property="id" />  
  4.     <result column="STATUS" property="status" />  
  5.     <result column="OP_USER" property="op_user" />  
  6.     <result column="OP_TIME" property="op_time" />  
  7.     <result column="BILL_NO" property="bill_no" />  
  8.     <result column="TRAN_NO" property="tran_no" />  
  9.     <result column="MEMO" property="memo" />  
  10.     <result column="DATA_TYPE" property="data_type" />          
  11. </resultMap>  
  12.   
  13.   
  14. <!-- jdbcType=INTEGER  ORACLE:INT-->  
  15. <select id="viewFlowLog" parameterType="java.util.Map" statementType="CALLABLE">  
  16.     <![CDATA[  
  17.         {call SP_TRACE_GET(#{I_DATA_TYPE,mode=IN,jdbcType=VARCHAR},  
  18.         #{I_TRAN_NO,mode=IN,jdbcType=VARCHAR},#{I_BILL_NO,mode=IN,jdbcType=NUMERIC},  
  19.         #{O_LIST,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=flowLogsResultMap})}  
  20.     ]]>  
  21. </select>  


在后台代码如下:

[java]  view plain  copy
  1. public List<FlowLogModel> viewFlowLog(String dataType, String tran_no,  
  2.         String bill_no) throws Exception {  
  3.         Map<String, Object> param = new HashMap<String, Object>();         
  4.             param.put("I_DATA_TYPE", dataType);  
  5.             param.put("I_TRAN_NO", tran_no);  
  6.             param.put("I_BILL_NO", bill_no);  
  7.             param.put("O_LIST", OracleTypes.CURSOR);  
  8.             flowLogDao.viewFlowLog(param);  
  9.     return (List<FlowLogModel>)param.get("O_LIST");  
  10. }  

由此完成调用与取返回值,值得说的下的是在配置文件中配置<parameterMap>时对应的

[html]  view plain  copy
  1. parameterType="java.util.Map"  

中的值全是java中具备的基础类型,而且根据字段的长度选择对应的类型。
MyBatis可以通过调用存储过程来执行数据库操作。下面是一个简单的示例: 1. 创建存储过程 在数据库中创建一个存储过程,例如: ```sql CREATE PROCEDURE get_user_by_id(IN id INT, OUT name VARCHAR(20)) BEGIN SELECT user_name INTO name FROM user WHERE user_id = id; END ``` 该存储过程接受一个输入参数id,一个输出参数name,根据id查询用户信息并将用户名赋值给name。 2. 编写Mapper文件 在MyBatis的Mapper文件中,定义一个<select>标签,调用存储过程,例如: ```xml <select id="getUserById" statementType="CALLABLE"> CALL get_user_by_id(#{id, mode=IN, jdbcType=INTEGER}, #{name, mode=OUT, jdbcType=VARCHAR}) </select> ``` 该<select>标签的id属性为getUserById,statementType属性为CALLABLE,表示调用存储过程。 3. 调用存储过程 通过SqlSession的selectOne方法调用存储过程,例如: ```java SqlSession sqlSession = sqlSessionFactory.openSession(); try { Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("id", 1); sqlSession.selectOne("getUserById", paramMap); String name = (String)paramMap.get("name"); // 处理返回值 } finally { sqlSession.close(); } ``` 该代码创建一个SqlSession对象,调用selectOne方法执行getUserById查询,将查询结果存储在paramMap中,最后从paramMap中获取name的值。 以上就是一个简单的MyBatis调用存储过程的示例,具体的实现方式还需要按照实际情况进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值