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数据库使用时的事务操作相关推荐

  1. spring boot整合MySQL数据库

    spring boot整合MySQL数据库 spring boot整合MySQL数据库可以说很简单,只需要添加MySQL依赖和在配置文件中添加数据库配置信息,利用spring-boot-starter ...

  2. MySQL数据库之SQL的各种操作/Html/Java和XML的关系

    MySQL数据库之SQL的各种操作/Html/Java和XML的关系 今天内容:(1)数据库的概述(2)MySQL数据库的环境搭建(3)常用的数据类型(4)DDL数据定义语句(5)DML数据操纵语句1 ...

  3. Python Web开发框架之Django篇——二、Django连接MySQL数据库以及建表的操作

    二.Django连接MySQL数据库以及建表的操作 准备工作:安装Python访问MySQL的模块 一.修改project同名目录下面的__init__.py文件 二.修改project同名目录下面的 ...

  4. 【接口测试】Day5-使用pymysql库对mysql数据库进行增删改查操作

    目录 今日目标 一.数据库介绍 二.数据库基本操作 1.安装 2.操作流程(重点) 1. 创建连接 2. 获取游标 3. 执行sql 4. 关闭游标 5. 关闭连接 3.数据准备 4.数据库基本操作 ...

  5. mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理

    这篇文章主要是从mysql数据库的逻辑架构来认识掌握mysql的原理.只要是稍微有一点计算机的相关知识相信都能看明白. 一.笼统的逻辑架构 先给出一张逻辑架构图,这张图是让你从宏观的角度来分析认识一下 ...

  6. spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库

    tags: springbatch 1.引言 上一篇文章<快速了解组件-spring batch(2)之helloworld>对Spring Batch进行了入门级的开发,也对基本的组件有 ...

  7. 使用Java语言开发工具idea连接MySQL数据库的基本步骤及操作实例

    Java连接MySQL数据库并进行一些基本操作以及导入jar包的两种方式 其实,任何开发工具连接数据库无非就是三步:1.安装驱动.2.加载驱动,创建连接对象.3.创建对象操作游标.4.游标调用函数完成 ...

  8. MySQL数据库引擎、数据事务与隔离级别

    MySQL数据库引擎 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...

  9. IDEA连接MySQL数据库并执行SQL查询操作

    打开IDEA后,新建一个项目或者在已有项目上均可操作!!! 1 打开数据库页面 1.1 方式一 在主页面工具栏上找到View(视图)-Tool Windows(工具窗口)-Database(数据库), ...

  10. mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享

    Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...

最新文章

  1. IDC运营商如何轻松建立属于自己的数据备份服务中心
  2. next_permutation函数
  3. python找人脚本_Python找出微信上删除你好友的人脚本写法
  4. SSM编写JavaWeb项目时,出现了errorCode 1045, state 28000和Invalid bound statement (not found)两个错误
  5. U3D 动态创建Prefab的多个实例
  6. Strut2的属性驱动,模型驱动的理解
  7. java创建类的三个步骤_3个简单步骤即可测试Java 8
  8. ruby打印_Ruby程序打印一个数字的乘法表
  9. SpringCloudConfig配置中心读取本地配置文件
  10. 前后落差大用什么词语_【刺激】全国最长滑索!“白云飞索”全长1500米,落差200多米!...
  11. 关于x210开发板和主机、虚拟机ping通问题
  12. 【转】【开源专访】谢宝友:会说话的Linux内核
  13. 雷士灯wifi控制方法_一种wifi无线控制的灯具系统的制作方法
  14. FineReport制作报表讲解(基本操作以及网络报表)
  15. Django setting ALLOWED_HOSTS
  16. 牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用
  17. 经历121,市场情绪极度恐慌,美联储加息对我们有什么影响,币圈人又该何去何从?
  18. nltk安装出错,nltk_data语料库下载
  19. 计算机方向 会议级别
  20. 基于Python的OpenCV函数----imshow(winname, mat)【显示图片】

热门文章

  1. 微软有“病”,推出bing,看上去算象个站内搜索,心寒!
  2. nginx 为什么要反向代理 影藏后端 高效连接(给nginx,他自己返回) 端口冲突解决 多个服务...
  3. RHEL服务器配置BIND以及实现DNS负载均衡
  4. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
  5. zabbix利用sendEmail邮件报警
  6. 轻量级web富文本框——wangEditor使用手册(3)——如何自定义配置菜单 demo
  7. 安装MySQL-python时发生错误:error: command 'gcc' failed with exit status 1
  8. JS鼠标捕获DIV内选中的坐标和宽高
  9. SharePoint Portal Server-管理匿名访问设置
  10. 5.从Paxos到Zookeeper分布式一致性原理与实践---使用ZooKeeper