MyBatis调用存储过程
MySQL存储过程
DROP PROCEDURE IF EXISTS transferMoney;
-- 实现转账功能的存储过程
CREATE PROCEDURE transferMoney (
IN fromUserId INT, -- 付款方
IN toUserId INT, -- 收款方
IN money DOUBLE, -- 转账金额
OUT state INT, -- 状态
OUT errorMsg VARCHAR(40) -- 异常信息
)
BEGIN
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;
set errorMsg = CONCAT('付款人金额更新影响行数为0,fromUserId:',fromUserId);
END IF; -- 再增加收款人的金额
UPDATE USER u SET u.money = u.money+money WHERE id = toUserId;
IF ROW_COUNT()=0 then -- 如果影响记录为0,表示异常,标示为99
set state = 99;
set errorMsg = CONCAT('收款人金额更新影响行数为0,toUserId:',toUserId);
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},
#{state,mode=OUT,jdbcType=INTEGER},
#{errorMsg,mode=OUT,jdbcType=VARCHAR})
}
</select>
UserServiceImpl.java代码
@Override
public void transferMoneyByProcedure(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);
//存储过程完成转账,打印执行结果,存储过程返回的out参数state, errorMsg值会保存在map中。
Logger.info(JSON.toJSONString(map));
int state = Integer.parseInt(map.get("state").toString());
if(state != 0) {
System.out.println("转账异常:"+map.get("errorMsg"));
} }
UserServiceTest.java代码
@Test
public void testTransferMoneyByProcedure() {
int fromUserId = 1;
int toUserId = 3;
userService.transferMoneyByProcedure(fromUserId, toUserId, 1001);
}
控制台结果
[com.ssm.dao.UserDao.transferMoney] - ==> Preparing: { call transferMoney (?, ?, ?, ?, ?) }
[com.ssm.dao.UserDao.transferMoney] - ==> Parameters: 1(Integer), 3(Integer), 1001.0(Double)
[com.ssm.common.Logger] - {"toUserId":3,"state":99,"money":1001,"errorMsg":"收款人金额更新影响行数为0,toUserId:3","fromUserId":1}
转账异常:收款人金额更新影响行数为0,toUserId:3
[org.springframework.context.support.GenericApplicationContext] - Closing org.springframework.context.support.GenericApplicationContext@7da3f9e4: startup date [Sat Oct 24 14:50:09 GMT+08:00 2015]; root of context hierarchy
数据库User表
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调用存储过程的更多相关文章
- MyBatis基础:MyBatis调用存储过程(6)
1. 存储过程准备 CREATE PROCEDURE sp_task ( IN userId INT ) BEGIN SELECT * FROM task WHERE user_id = userId ...
- 使用mybatis调用存储过程(注解形式和配置文件形式)
最近在看资料中涉及到mybatis,突然想到mysql中的视图.存储过程.函数.现将在使用mybatis调用mysql的存储过程使用总结下: 使用的环境:mybatis3.4.6,mysql 5.6, ...
- Mybatis调用存储过程报错
Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...
- 关于用mybatis调用存储过程时的入参和出参的传递方法
一.问题描述 a) 目前调用读的存储过程的接口定义一般是:void ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...
- mybatis 调用存储过程 返回游标 实例
存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...
- MyBatis——调用存储过程
原文:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 ...
- mybatis调用存储过程,获取返回的游标
将调用存储过程参数放入map中,由于返回的游标中包含很多参数,所以再写一个resultmap与之对应,类型为hashmap.设置返回的jdbcType=CURSOR,resultMap设置为id对应的 ...
- mybatis调用存储过程(@Select方式)
存储过程还不会写的同学可以参考我另一篇文章:https://www.cnblogs.com/liuboyuan/p/9375882.html 网上已经有很多用mybatis调用的教程了,但是大部分是x ...
- MyBatis调用存储过程,含有返回结果集、return参数和output参数
Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...
- Mybatis 调用存储过程,使用Map进行输入输出参数的传递
做个记录,以备后用 java代码: public String texuChange() throws Exception { try { ...
随机推荐
- /WEB-INF/userManage.jsp(31,82) Unterminated ${ tag
这个错误是说明${}少写了一半. Unterminated有这个的意思是你的jsp语法有错误
- [转] 再探java基础——break和continue的用法
原文地址:http://blog.csdn.net/luoweifu/article/details/10756017 break break可用于循环和switch...case...语句中. 用于 ...
- java.lang.NoClassDefFoundError: org/jaxen/JaxenException
今天想要解析 xml 文件,查了下,解析xml 的可以用:jdom 或者 dom4j 使用dom4j 来选用某一个指定元素的时候,如 List<Element> childElements ...
- jQuery Select的操作集合
1. $("#select_id").change(function(){... }); //为select添加事件,当选择其中一项时触发2. $("#select_ ...
- 【codevs1014/1068】背包型动态规划
分析: 状态转移方程: v[j]=max(v[j],v[j-a[i]]+a[i]) (j ← tol downto a[i]) /* 作者:flipped 题目:p1014 装箱问题 */ #incl ...
- CruiseControl.NET开篇
在这里说明一下,我终于踏上了CruiseControl.NET这条不归路了,为什么我会觉得是一条不归路,原因很简单,就是这东西在现在这个阶段已经很久没有在园子里有活跃度了,基本上到了已经可以到了让大家 ...
- android加载大图片到内存
1)演示效果: 1)代码演示: 布局代码: 权限配置:
- c++ 类型安全
类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域.“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制:有的时候也用“类型安全”形容 ...
- 初学Hibernate
Hibernate 是完全ORM的,只需要对 对象 进行操作,生成底层SQL语句 优势:1.可以简化开发 2.性能好(原生的Hibernate性能很差,要使用它,需要进行优化),优化方式:一级缓存.二 ...
- Chord算法
转自:http://blog.csdn.net/wangxiaoqin00007/article/details/7374833 虽然网上搜索CHord,一搜一大堆,但大多讲得不太清楚明白.今天发现一 ...