码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis调用存储过程

时间:2015-10-23 18:36:56      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

MySQL存储过程

DROP PROCEDURE IF EXISTS transferMoney;
-- 实现转账功能的存储过程
CREATE PROCEDURE transferMoney (
    IN fromUserId INT,-- 付款方
    IN toUserId INT,    -- 收款方
    IN money DOUBLE)    -- 转账金额
BEGIN
        DECLARE state INT;    -- 运行状态
        SET state = 0;            -- 0表示正常,99表示异常
        START TRANSACTION;    -- 启用事务

        -- 先扣除付款人的金额
        UPDATE USER u SET u.money = u.money-money WHERE id = fromUserId;
            IF ROW_COUNT()=0 then  -- 如果影响记录为0,表示异常,标示为99
                set state = 99;
            END IF;

        -- 再增加收款人的金额
        UPDATE USER u SET u.money = u.money+money WHERE id = toUserId;
            IF ROW_COUNT()=0 then  -- 如果影响记录为0,表示异常,标示为99
                set state = 99;
            END IF;
        
        -- 如果运行正常则提交,否则,回滚
        IF state=0 then 
            COMMIT;
        ELSE 
            ROLLBACK;
        END IF;
END;

 MyBatis映射文件UserMapper.xml

<select id="transferMoney" statementType="CALLABLE" parameterType="java.util.HashMap">
        {
        call transferMoney (#{fromUserId,mode=IN,jdbcType=INTEGER},
                            #{toUserId,mode=IN,jdbcType=INTEGER},
                            #{money,mode=IN,jdbcType=DOUBLE})
        }
 </select>

 Java代码

@Override
    public void transferMoneyByProcedureTX(int fromUserId, int toUserId, double money) {
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("fromUserId",fromUserId);
        map.put("toUserId", toUserId);
        map.put("money", money);
        userDao.transferMoney(map);
    }

 Spring事务配置

<!-- 第一种配置事务的方式 ,tx-->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />
            <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception" />
            <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="*TX" propagation="REQUIRED" rollback-for="Exception"/>
            <!-- 存储过程都是自带了事务处理,所以这里配置NEVER了 -->
            <tx:method name="*Procedure" propagation="NEVER" rollback-for="Exception"/>
            <tx:method name="*" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="serviceMethod" expression="execution(* com.ssm.service.*.*(..))"/>
        <aop:advisor pointcut-ref="serviceMethod" advice-ref="txadvice"/>
    </aop:config>

 

MyBatis调用存储过程

标签:

原文地址:http://www.cnblogs.com/cocoat/p/4905226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!