如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作
Ibatis是MyBatis的前身,它是一个开源的持久层框架。它的核心是SqlMap——将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开。Ibatis是“半自动化”的ORM持久层框架。这里的“半自动化”是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言的,“全自动”ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行。而Ibatis的着力点,则在于POJO与SQL之间的映射关系,即Ibatis并不会为程序员在运行期自动生成并执行SQL,具体的SQL语句需要程序员编写,然后通过映射配置文件将SQL语句所需的参数和返回的结果字段映射到指定POJO中。本篇博客演示了如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作:
工程结构如下图:
由于该例子介绍的比较全面,文件比较多,这里只给出上图标出的三个文件中的代码,完整的源码可通过点击本文最下面的超链接下载:
BankCardDao.java文件中的代码:
package com.ghj.dao.imp;import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.transaction.annotation.Transactional;import com.ghj.dao.IBankCardDao;/*** 银行卡管理数据访问层接口实现类* * @author 高焕杰*/
public class BankCardDao extends SqlMapClientDaoSupport implements IBankCardDao {/*** 转账* @param outAccount 转出账户* @param inAccount 转入账号* @param amountOfMoney 金额* * @author 高焕杰*/@Override@Transactional//采用注释的方式实现事务操作public boolean transferAccounts(String outAccount, String inAccount, long amountOfMoney){try {long outAccountDeposit = findDepositByAccount(outAccount);//转出账户的存款long inAccountDeposit = findDepositByAccount(inAccount);//转入账户的存款if(updateDepositByAccount(outAccountDeposit - amountOfMoney, outAccount)){//更新转出账号存款updateDepositByAccount(inAccountDeposit + amountOfMoney, inAccount);//更新转入账号存款
// outAccount = null;
// System.out.println(outAccount.equals(inAccount));//故意出现异常以测试事务是否回滚}return true;} catch (SQLException e) {System.err.println("转账失败,事务回滚");e.printStackTrace();}return false;}/*** 依据账号查询存款* @param deposit 存款* * @author 高焕杰*/private long findDepositByAccount(String account) throws SQLException{return (Long)getSqlMapClientTemplate().queryForObject("findDepositByAccount", account);}/*** 依据账号更新存款* @param deposit 存款* @param account 账号* * @author 高焕杰*/private boolean updateDepositByAccount(long deposit, String account) throws SQLException{Map<String, Object> params = new HashMap<String, Object>();params.put("deposit", deposit);params.put("account", account);return getSqlMapClientTemplate().update("updateDepositByAccount", params) > 0;}
}
application-context.xml文件中的代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd"default-autowire="byName" default-lazy-init="false"><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="false" destroy-method="close"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8"></property><property name="user" value="root"></property><property name="password" value=""></property><property name="acquireIncrement" value="5"></property><property name="initialPoolSize" value="5"></property><property name="minPoolSize" value="5"></property><property name="maxPoolSize" value="20"></property><property name="maxStatements" value="100"></property><property name="numHelperThreads" value="10"></property><property name="maxIdleTime" value="60"></property></bean><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation"><value>classpath:config/sqlMapConfig.xml</value></property><property name="dataSource" ref="dataSource"/></bean><bean id="bankCardDao" class="com.ghj.dao.imp.BankCardDao"><property name="sqlMapClient"><ref bean="sqlMapClient"/></property></bean><!-- Spring中配置事务操作:在Spring中实现事务操作有多种方式,其中以注解的方式最为常用,该种方式需要在需要配置事务操作的方法上添加@Transactional注释 --><bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><tx:annotation-driven transaction-manager="dataSourceTransactionManager" />
</beans>
bankcard.xml文件中的代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap><!-- 依据账号查询存款 --><select id="findDepositByAccount" parameterClass="string" resultClass="long">select deposit from lm_bank_card where account=#account# </select><!-- 依据账号更新存款 --><update id="updateDepositByAccount" parameterClass="java.util.HashMap">update lm_bank_card set deposit=#deposit# where account=#account# </update>
</sqlMap>
【0分下载该示例代码】
如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作相关推荐
- spring boot整合MySQL数据库
spring boot整合MySQL数据库 spring boot整合MySQL数据库可以说很简单,只需要添加MySQL依赖和在配置文件中添加数据库配置信息,利用spring-boot-starter ...
- MySQL数据库之SQL的各种操作/Html/Java和XML的关系
MySQL数据库之SQL的各种操作/Html/Java和XML的关系 今天内容:(1)数据库的概述(2)MySQL数据库的环境搭建(3)常用的数据类型(4)DDL数据定义语句(5)DML数据操纵语句1 ...
- Python Web开发框架之Django篇——二、Django连接MySQL数据库以及建表的操作
二.Django连接MySQL数据库以及建表的操作 准备工作:安装Python访问MySQL的模块 一.修改project同名目录下面的__init__.py文件 二.修改project同名目录下面的 ...
- 【接口测试】Day5-使用pymysql库对mysql数据库进行增删改查操作
目录 今日目标 一.数据库介绍 二.数据库基本操作 1.安装 2.操作流程(重点) 1. 创建连接 2. 获取游标 3. 执行sql 4. 关闭游标 5. 关闭连接 3.数据准备 4.数据库基本操作 ...
- mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理
这篇文章主要是从mysql数据库的逻辑架构来认识掌握mysql的原理.只要是稍微有一点计算机的相关知识相信都能看明白. 一.笼统的逻辑架构 先给出一张逻辑架构图,这张图是让你从宏观的角度来分析认识一下 ...
- spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库
tags: springbatch 1.引言 上一篇文章<快速了解组件-spring batch(2)之helloworld>对Spring Batch进行了入门级的开发,也对基本的组件有 ...
- 使用Java语言开发工具idea连接MySQL数据库的基本步骤及操作实例
Java连接MySQL数据库并进行一些基本操作以及导入jar包的两种方式 其实,任何开发工具连接数据库无非就是三步:1.安装驱动.2.加载驱动,创建连接对象.3.创建对象操作游标.4.游标调用函数完成 ...
- MySQL数据库引擎、数据事务与隔离级别
MySQL数据库引擎 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...
- IDEA连接MySQL数据库并执行SQL查询操作
打开IDEA后,新建一个项目或者在已有项目上均可操作!!! 1 打开数据库页面 1.1 方式一 在主页面工具栏上找到View(视图)-Tool Windows(工具窗口)-Database(数据库), ...
- mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享
Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...
最新文章
- IDC运营商如何轻松建立属于自己的数据备份服务中心
- next_permutation函数
- python找人脚本_Python找出微信上删除你好友的人脚本写法
- SSM编写JavaWeb项目时,出现了errorCode 1045, state 28000和Invalid bound statement (not found)两个错误
- U3D 动态创建Prefab的多个实例
- Strut2的属性驱动,模型驱动的理解
- java创建类的三个步骤_3个简单步骤即可测试Java 8
- ruby打印_Ruby程序打印一个数字的乘法表
- SpringCloudConfig配置中心读取本地配置文件
- 前后落差大用什么词语_【刺激】全国最长滑索!“白云飞索”全长1500米,落差200多米!...
- 关于x210开发板和主机、虚拟机ping通问题
- 【转】【开源专访】谢宝友:会说话的Linux内核
- 雷士灯wifi控制方法_一种wifi无线控制的灯具系统的制作方法
- FineReport制作报表讲解(基本操作以及网络报表)
- Django setting ALLOWED_HOSTS
- 牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用
- 经历121,市场情绪极度恐慌,美联储加息对我们有什么影响,币圈人又该何去何从?
- nltk安装出错,nltk_data语料库下载
- 计算机方向 会议级别
- 基于Python的OpenCV函数----imshow(winname, mat)【显示图片】
热门文章
- 微软有“病”,推出bing,看上去算象个站内搜索,心寒!
- nginx 为什么要反向代理 影藏后端 高效连接(给nginx,他自己返回) 端口冲突解决 多个服务...
- RHEL服务器配置BIND以及实现DNS负载均衡
- 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
- zabbix利用sendEmail邮件报警
- 轻量级web富文本框——wangEditor使用手册(3)——如何自定义配置菜单 demo
- 安装MySQL-python时发生错误:error: command 'gcc' failed with exit status 1
- JS鼠标捕获DIV内选中的坐标和宽高
- SharePoint Portal Server-管理匿名访问设置
- 5.从Paxos到Zookeeper分布式一致性原理与实践---使用ZooKeeper