Mybatis调用存储过程

本文介绍了一个MySQL存储过程的创建及使用MyBatis进行调用的方法。存储过程实现了更新多个表中电话号码的功能,并通过事务确保数据一致性。同时详细展示了MyBatis配置文件中的参数映射及调用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用到了存储过程,搞好好半天才弄好,在此记录下;还有Hibernate也可以调用存储过程,但是只能用xml配置的。

mysql存储过程:

CREATE PROCEDURE `customer_pro`(
        IN orderId varchar(20),
        IN phoneNumber varchar(20),
        OUT result varchar(50)
)
BEGIN       

    DECLARE customerId varchar(20) CHARACTER set utf8 DEFAULT NULL;

    DECLARE t_error INTEGER DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND SET t_error=1;
    
    SET result="更新失败";

    SELECT customer_id INTO customerId  FROM anjia_order where order_id=orderId and deleted=0;
    
    START TRANSACTION;
    UPDATE anjia_order SET applicant_phone=phoneNumber WHERE order_id=orderId and deleted=0;
    UPDATE customer SET phone_number=phoneNumber WHERE customer_id=customerId and deleted=0;
    UPDATE repayment_record SET customer_phone=phoneNumber WHERE order_id=orderId and customer_id=customerId and deleted=0;
    UPDATE protocol SET applicant_phone=phoneNumber where order_id=orderId;
    UPDATE customer_info SET applicant_phone=phoneNumber where order_id=orderId and deleted=0;
    UPDATE loan_record SET customer_phone=phoneNumber where order_id=orderId and customer_id=customerId and deleted=0;
    
    if t_error =1 THEN
        ROLLBACK;
        SET result="更新失败";
    ELSE
        COMMIT;
        SET result="更新成功";
    END IF;
    
    SELECT result;

END

存储过程的简单说明,DECLARE声明过程变量, START TRANSACTION开起事务,ROLLBACK回滚与COMMIT提交,最后返回result结果。

mybatis配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--命名空间必须指向接口类 -->
<mapper namespace="com.anjia.bg.dao.CustomerDao">
    <!--获取报表的时间范围条件[每个报表只有一条数据] -->
    <parameterMap type="java.util.Map" id="customerMap">
        <parameter property="phoneNumber" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"></parameter>
        <parameter property="orderId" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"></parameter>
        <parameter property="result" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT"></parameter>
    </parameterMap>
    <select id="updateCustomerPhone"  parameterMap="customerMap" statementType="CALLABLE" resultType="java.lang.String">
         <![CDATA[
            {call customer_pro(?,?,?)}   
            ]]>
    </select>
</mapper>

在这里配置xml时用的时间最多,要有这个parameterMap给存储过程中的parameter赋值,如果不这么配就会报没有parameter的错误;

没有statementType="CALLABLE"也会报错,意思大概是不能赋值;没有resultType="java.lang.String"会报返回值不能赋值。

service调用:

        Map<String,String> params=new HashMap<>();
        params.put("orderId", orderId);
        params.put("phoneNumber", phoneNumber);
        params.put("result", "");
        String result = customerDao.updateCustomerPhone(params);
        return JsonResult.newJsonResult().setSuccess(true).setMessage(result);

该篇文章借鉴了http://blog.youkuaiyun.com/wangchangpen62/article/details/44961983文章完成配置的,但是遇到了不同的问题,不知道是不是版本的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值