今天用到了存储过程,搞好好半天才弄好,在此记录下;还有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文章完成配置的,但是遇到了不同的问题,不知道是不是版本的区别。