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 { ...
 
随机推荐
- Bootstrap3.0学习第十九轮(JavaScript插件——标签页)
			
详情请看 http://aehyok.com/Blog/Detail/46.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
 - Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟
			
题目链接: http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test4 secondsmem ...
 - LCA最近公共祖先 Tarjan离线算法
			
学习博客: http://noalgo.info/476.html 讲的很清楚! 对于一颗树,dfs遍历时,先向下遍历,并且用并查集维护当前节点和父节点的集合.这样如果关于当前节点(A)的关联节点( ...
 - Java算法-符号&
			
&与运算符 与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0 例如下面的程序段. public class data13 { public s ...
 - JS弹出窗口代码大全(详细整理)
			
1.弹启一个全屏窗口 复制代码代码如下: <html> <body http://www.jb51.net','脚本之家','fullscreen');">; < ...
 - 洛谷P1755 斐波那契的拆分
			
题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个数n(如题) 输出格式: t ...
 - Linux Rootkit Learning
			
目录 . 学习Rootkit需要了解的基础知识 . 挂钩(HOOKING) . 直接内核对象操作 . LSM框架(Linux Security Module)于LKM安全 . rootkit检测技术及 ...
 - 从注册流程 分析如何安全退出多个Activity   多种方式(附DEMO)
			
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...
 - Android模拟器端口被占用问题的解决办法
			
一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured& ...
 - OracleBulkCopy批量插入数据
			
1.OracleBulk程序集引用using ODAC = Oracle.DataAccess.Client 2.有时候不做字段映射,会使导入的数据出错 上代码 /// <summary> ...