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 { ...
随机推荐
- Javascript基础系列之(七)函数(对象和属性)
包含在对象里的数据可以通过两种方式来访问 既属性的对象(property)和方法(method) 属性是隶属于某个特定对象的变量,方法则是某个特定对象才能调运的函数. 对象是由一些彼此相关的属性和方法 ...
- DOM(八)使用DOM控制表单
1.表单简介 表单<form>是网页中交互最多的形式之一,它通过各种形式接收用户的数据,包括下拉列表框,单选按钮,复选框和文本框,本篇主要介绍表单中常用的属性和方法 javascript中 ...
- angular学习-入门基础
angular .caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #00 ...
- UIToolbar 如何调整里面的按钮位置
可以在Bar Button Item后面填个Fixed Space Bar Button Item 或者Flexible Space Bar Button Item,然后再在后面加上下一个Bar Bu ...
- 并行程序设计模式--Master-Worker模式
简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务 ...
- javascript与服务器3
一, 带参数的XMLHTTP请求 1, 进行get请求 get请求最常见的是在浏览器地址栏中输入URL并打开页面时,这就是向服务器发送一个get请求. 它的限制是URL最大长度不能超过2048字符(2 ...
- hdu2072 字典树
这题印象深刻,我刚接触acm时,以为这题是水题(因为是中文,又短),一直没做出.现再想想也是.可能也是我以前字符串掌握不好: 这题其实也可以用stl里的map写.这里我用字典树写的.其实这题算简单题了 ...
- [转]window.opener用法
window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html" ...
- BZOJ-1008 越狱 数论快速幂
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6192 Solved: 2636 [Submit][Status] ...
- MyEclipse10中导入的jquery文件报错(出现红叉叉,提示语法错误)
为了做一个页面特效,导入了一个jQuery文件,怎想,myeclipse竟然报错说是语法错误,但是这个js文件我是从官网上下载的,不应该出错才对,百度谷歌之后终于找到了解决办法: 选中报错的js文件, ...