SpringBoot整合Mybatis,并实现事务控制

1、 在pom文件里添加相关maven文件

    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- Junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2、 在application.properties配置文件中引入数据源,创建数据库表,并插入两条原始数据:andy 余额200元,lucy 余额300元

1 spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo
2 spring.datasource.username=root
3 spring.datasource.password=root
4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
DROP TABLE IF EXISTS tbl_account;
CREATE TABLE tbl_account (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
balance float,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; insert into tbl_account(id,name,balance) values(1, 'andy','200');
insert into tbl_account(id,name,balance) values(2, 'lucy','300');

数据库初始值如下:

3、 开发实体类,dao,service,controller,mapper等
实体类 :

public class Account {

    private int id;
private String name;
private float balance; public Account() { }
// 省略setter / getter
}

dao :

public interface AccountDao {

    public void moveIn(@Param("id") int id, @Param("money") float money); // 转入

    public void moveOut(@Param("id") int id, @Param("money") float money); // 转出
}

service :

1 public interface AccountService {
2 //转账
3 public void transfer(int outter,int inner,Integer money);
4
5 }

service 实现类:

 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 public void transfer(int outter, int inner, Integer money) {
8
9 accountDao.moveOut(outter, money); //转出
10 accountDao.moveIn(inner, money); //转入
11
12 }
13 }

controller:

 1 @RestController
2 @RequestMapping(value = "/account")
3 public class AccountController {
4
5 @Autowired
6 private AccountService accountService;
7
8
9 @RequestMapping("/transfer")
10 public String test(){
11 try {
12 // andy 给lucy转账50元
13 accountService.transfer(1, 2, 50);
14 return "转账成功";
15 } catch (Exception e) {
16 e.printStackTrace();
17 return "转账失败";
18 }
19 }
20 }

mapper:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cn.yideng.tx.dao.AccountDao"> <!-- 转入 -->
<update id="moveIn" >
update tbl_account
set balance = balance + #{money }
where id= #{id,jdbcType=INTEGER}
</update> <!-- 转出 -->
<update id="moveOut" >
update tbl_account
set balance = balance - #{money }
where id= #{id,jdbcType=INTEGER}
</update> </mapper>
 

4、 在application.properties配置文件中添加对mapper文件的扫描

1 mybatis.typeAliasesPackage: cn.yideng.*.entity
2 mybatis.mapperLocations: classpath:mapper/*.xml

5、 在启动类中添加对mapper包扫描@MapperScan

1 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
2 @EnableAutoConfiguration
3 @MapperScan("cn.yideng.*.dao")
4 public class DemoApplication {
5
6 public static void main(String[] args) {
7 SpringApplication.run(DemoApplication.class, args);
8 }
9 }
 

6、 浏览器测试 http://localhost:8080/account/transfer , 测试显示 转账成功,看看数据库的数据,andy余额是150, lucy余额350,都是对的,如下图所示。

7,接着我们修改service,在实现类里,转出之后抛个异常,代码如下

 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 public void transfer(int outter, int inner, Integer money) {
8
9 accountDao.moveOut(outter, money); //转出
10 int i = 1/0; // 抛出异常
11 accountDao.moveIn(inner, money); //转入
12
13 }
14 }
 

8,把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是150, lucy余额300,如下图所示。


相当于转出成功,转入没有成功,这是不对的,应该都成功,或者都不成功。

9, 我们接着在service实现类上添加@Transactional 注解,声明一个事务,如下

 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 @Transactional
8 public void transfer(int outter, int inner, Integer money) {
9
10 accountDao.moveOut(outter, money); //转出
11 int i = 1/0; // 抛出异常
12 accountDao.moveIn(inner, money); //转入
13
14 }
15 }

10,再把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是200, lucy余额300,如下图所示。

说明转出和转入都没有成功,这才是合乎逻辑的。

springboot 开启事物很简单,只需要加注解@Transactional 和 @EnableAutoConfiguration,声明事务就可以了,

SpringBoot整合Mybatis,并实现事务控制的更多相关文章

  1. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.

    用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...

  2. SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)

    1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...

  3. spring与mybatis集成和事务控制

    一个. 基本介绍 本文将使用spring整合mybatis, 并加入事务管理, 以此为记, 方便以后查阅. 二. 样例 1. 代码结构图: 2. 建表语句: DROP DATABASE test; C ...

  4. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  5. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  6. springBoot整合mybatis、jsp 或 HTML

    springBoot整合mybatis.jsp Spring Boot的主要优点: 1:  为所有Spring开发者更快的入门: 2:  开箱即用,提供各种默认配置来简化项目配置: 3:  内嵌式容器 ...

  7. SpringBoot整合Mybatis之进门篇

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  8. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例

    1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...

  9. springboot整合mybatis(SSM开发环境搭建)

    0.项目结构: ---------------------方法一:使用mybatis官方提供的Spring Boot整合包实现--------------------- 1.application.p ...

随机推荐

  1. Hadoop学习之 HIVE 多用户模式安装

    一.启动hadoop 集群 1.启动zookeeper 集群   zkServer.sh start 2.在master.hadoop 机器上 ./start-all.sh 由于 start-all命 ...

  2. CSS行高——line-height 垂直居中等问题

    CSS行高——line-height   初入前端的时候觉得CSS知道display.position.float就可以在布局上游刃有余了,随着以后工作问题层出不穷,才逐渐了解到CSS并不是几个sty ...

  3. 记一次nodemanager无法启动的情况

    早上看CDH发现有一个nodemanager挂掉 然后查看对应的日志. 发现在日志里面并没有错误.,然然后发现服务器的磁盘满了,赶紧清理磁盘空间 清理磁盘的时候发现主要是/tmp目录下面生成了很多  ...

  4. VMware:未能将管道连接到虚拟机, 所有的管道范例都在使用中

    问题描述:虚拟机下的Ubuntu系统长时间死机无法正常关机,用Windows任务管理器关闭VMware也关不掉,没办法,只能直接关电脑了...重新打开电脑,启动VMware,发现提示客户机已经处于打开 ...

  5. win10 安装ubuntu16.04双系统

    安装了两天的ubuntu系统,很是头疼,发现网上的内容,比较繁杂,因此,写此博客,进行综合整理,总结了安装方法.方便大家安装,减少搜索. 电脑是老师的电脑,配置为: 主板:微星 CPU:英特尔i5 7 ...

  6. SQLServer中跨服务器跨数据库之间的数据操作

    首先必须理解一个概念: select * from sys.servers         (查看系统表,看原来的服务器名) 要想跨域就必须在以上信息中可以检索到! 怎样添加? --创建链接服务器  ...

  7. jquery判断cookie是否存在

    首先请加载jquery库与jquery cookie插件 http://code.jquery.com/jquery-latest.js http://files.cnblogs.com/afish/ ...

  8. 从Buck-Boost到Flyback

    电源的拓扑有很多种,但是其实我们能够理解一种拓扑,就可以理解其他拓扑结构.因为组成各种拓扑的基本元素是一样的. 对于隔离电源.大家接触最多的电路拓扑应该是 flyback. 但是大家一开始做电源的时候 ...

  9. jquery 图片切换

    仿着写的一个jquery的图片切换小插件,代码如下: html: <!DOCTYPE html> <html lang="en"> <head> ...

  10. react浏览器回退按钮的时候传递参数

    本来是有这个需求的,但是后来发现回退不也是到某个页面吗?接下来就使用了redux,真香啊,不管用户怎么操作,你到这个界面都给他一个值就完事了,没有就不给他这个值. 哈哈哈,公司框架使用umi.上代码 ...