打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
spring mybatis之声明式事务管理初识(小实例)

前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理.

1.事务管理

理解事务管理之前,先通过一个例子讲一下什么是事务管理:取钱。

比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。 事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

事务有四个特性:ACID

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

2.小实例工程

(1)工程目录:

(2)建立数据库transaction,建立一张user表:

(3)建立User.java类:

package com.gnc.model;public class User { private String id; private String name; public String getId { return id; } public void setId(String id) { this.id = id; } public String getName { return name; } public void setName(String name) { this.name = name; } public User { } public User(String id, String name) { super; this.id = id; this.name = name; }}

(4)建立UserDao.java数据访问接口:

package com.gnc.dao;import java.util.List;import java.util.Map;import com.gnc.model.User;public interface UserDao { public int countAll; public void insertUser(User user); public List getAllUser; public User getById(String id); public void deleteUser(String id); public void updateUser(Map map);}

(5)建立实现UserDaoImpl.java类:

package com.gnc.daoImpl;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.gnc.dao.UserDao;import com.gnc.mapper.UserMapper;import com.gnc.model.User;@Service('userDao')public class UserDaoImpl implements UserDao { @Autowired private UserMapper userMapper; public int countAll { return this.userMapper.countAll; } @Override public void insertUser(User user) { this.userMapper.insertUser(user); } @Override public List getAllUser { return this.userMapper.getAllUser; } @Override public User getById(String id) { return this.userMapper.getById(id); } @Override public void deleteUser(String id) { this.userMapper.deleteUser(id); } @Override public void updateUser(Map map) { this.userMapper.updateUser(map); }}

(6)建立UserDao接口访问映射文件UserDaoMapper.xml:

INSERT INTO user(id,name) VALUES(?,?) DELETE FROM user WHERE id=#{value} UPDATE user SET name=#{name} WHERE id=#{id}

(7)建立UserService.java接口类:

package com.gnc.service;import java.util.Map;import com.gnc.model.User;public interface UserService { public int countAll; public void insertUser(User user); public void update_insert(Map map, User user);}

(8)建立UserServiceImpl.java实现类:

package com.gnc.serviceImpl;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.gnc.dao.UserDao;import com.gnc.model.User;import com.gnc.service.UserService;@Service('userService')public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public int countAll { return this.userDao.countAll; } @Override public void insertUser(User user) { this.userDao.insertUser(user); throw new RuntimeException('Error'); } @Override public void update_insert(Map map, User user) { this.userDao.updateUser(map); this.userDao.insertUser(user); throw new RuntimeException('Error'); }}

(9)建立mybatis配置文件MyBatis-Configuration.xml:

(10)建立数据库配置文件config.properties:

db.driverClass=org.gjt.mm.mysql.Driverdb.jdbcUrl=jdbc:mysql://localhost:3306/transactiondb.user=rootdb.password=geningchao#db.initialPoolSize=20db.maxIdleTime=60db.maxPoolSize=200db.minPoolSize=50#db.acquireIncrement=3db.acquireRetryDelay=1000db.acquireRetryAttempts=30db.breakAfterAcquireFailure=false

(11)建立spring配置文件applicationContext.xml:

(12)建立测试类UserServiceTest.java:

package com.gnc.test;import java.util.HashMap;import java.util.Map;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.gnc.model.User;import com.gnc.service.UserService;public class UserServiceTest { @Test public void userServiceTest{ @SuppressWarnings('resource') ApplicationContext context = new ClassPathXmlApplicationContext('applicationContext.xml'); UserService userService = (UserService)context.getBean('userService'); User user =new User; user.setId('003'); user.setName('樱木花道'); Map map=new HashMap; map.put('id', '001'); map.put('name', '方舟子'); try { System.out.println(userService.countAll); userService.update_insert(map, user); } catch (Exception e) { e.printStackTrace; } }}

3.工程分析

该工程属于声明式事务管理,事务管理的主要配置是写在spring的配置文件当中,工程运行时,先加载spring配置文件,通过spring配置文件得到mybatis配置文件,得到映射文件,进行事务处理以及书屋管理.但是这种事务管理方式限制了包的分级结构和函数名的前缀,所以一般情况下,我们使用注解式事务管理,注解式事务管理实例将在下一章节给出并进行说明!

以上仅是个人观点,若有不对,敬请扶正!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mybatis入门基础(二)
spring-boot 集成mybatis配置使用
基于Spring Mybatis jsp servlet的用户登录注册功能(数据库查找和插入用户),jsp写的前端(css javascript),使用IDEA
SpringBoot MyBatis 实现分页查询数据【SpringBoot系列4】
Spring3.2.4 和 MyBatis 整合笔记
高并发请求测试
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服