Spring Boot 使用事务非常简单,底层依然采用的是 Spring 本身提供的事务管理
➢ 在入口类中使用注解 @EnableTransactionManagement 开启事务支持
➢ 在访问数据库的 Service 方法上添加注解 @Transactional 即可
通过 SpringBoot +MyBatis 实现对数据库学生表的更新操作,在 service 层的方法中构建
异常,查看事务是否生效。
项目结构

1.pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.it</groupId><artifactId>019-springboot-transactional</artifactId><version>0.0.1-SNAPSHOT</version><name>019-springboot-transactional</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!--web的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mybatis的起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><!--处理资源目录--><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources><plugins><!--mybatis代码自动生成插件--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><configuration><!--配置文件的位置:在项目的根目录下,和src是平级的--><configurationFile>GeneratorMapper.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.添加GeneratorMapper.xml在整个项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 指定连接数据库的JDBC驱动包所在位置,指定到你本机的完整路径 --><classPathEntry location="D:\jsp\MySql数据库软件\mysql-connector-java-5.1.48\mysql-connector-java-5.1.48.jar"/><!-- 配置table表信息内容体,targetRuntime指定采用MyBatis3的版本 --><context id="tables" targetRuntime="MyBatis3"><!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 --><commentGenerator><property name="suppressAllComments" value="true" /></commentGenerator><!-- 配置数据库连接信息 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/springboot1"userId="root"password="输入你的数据库连接密码"></jdbcConnection><!-- 生成model类,targetPackage指定model类的包名, targetProject指定生成的model放在eclipse的哪个工程下面--><javaModelGenerator targetPackage="com.it.model"targetProject="D:\JAVA互联网分布式\springBoot2Test\019-springboot-transactional\src\main\java"><property name="enableSubPackages" value="false" /><property name="trimStrings" value="false" /></javaModelGenerator><!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在eclipse的哪个工程下面 --><sqlMapGenerator targetPackage="mapper" targetProject="src\main\resources"><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- 生成MyBatis的Mapper接口类文件,targetPackage指定Mapper接口类的包名, targetProject指定生成的Mapper接口放在eclipse的哪个工程下面 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.it.dao" targetProject="src/main/java"><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- 数据库表名及对应的Java模型类名 --><table tableName="student" domainObjectName="Student"enableCountByExample="false"enableUpdateByExample="false"enableDeleteByExample="false"enableSelectByExample="false"selectByExampleQueryId="false"/></context></generatorConfiguration>

 3.点击mybatis逆向工程的插件,自动生成model包下的实体类Studnet

package com.it.model;public class Student {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

4.mybatis逆向工程插件自动生成dao包下的StudentMapper接口

package com.it.dao;import com.it.model.Student;public interface StudentMapper {int deleteByPrimaryKey(Integer id);int insert(Student record);int insertSelective(Student record);Student selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(Student record);int updateByPrimaryKey(Student record);
}

5.mybatis逆向工程插件自动生成resources目录下的mapper包下的StudentMapper.xml文件

<?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="com.it.dao.StudentMapper"><resultMap id="BaseResultMap" type="com.it.model.Student"><id column="id" jdbcType="INTEGER" property="id" /><result column="name" jdbcType="VARCHAR" property="name" /><result column="age" jdbcType="INTEGER" property="age" /></resultMap><sql id="Base_Column_List">id, name, age</sql><select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">select <include refid="Base_Column_List" />from studentwhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">delete from studentwhere id = #{id,jdbcType=INTEGER}</delete><insert id="insert" parameterType="com.it.model.Student">insert into student (id, name, age)values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})</insert><insert id="insertSelective" parameterType="com.it.model.Student">insert into student<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if><if test="name != null">name,</if><if test="age != null">age,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id,jdbcType=INTEGER},</if><if test="name != null">#{name,jdbcType=VARCHAR},</if><if test="age != null">#{age,jdbcType=INTEGER},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.it.model.Student">update student<set><if test="name != null">name = #{name,jdbcType=VARCHAR},</if><if test="age != null">age = #{age,jdbcType=INTEGER},</if></set>where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="com.it.model.Student">update studentset name = #{name,jdbcType=VARCHAR},age = #{age,jdbcType=INTEGER}where id = #{id,jdbcType=INTEGER}</update>
</mapper>

6.设置项目核心配置文件application.properties文件

#设置端口
server.port=9002
server.servlet.context-path=/mytrans#配置数据库
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456#配置mybatis
mybatis.mapper-locations=classpath:mapper/*.xml#开启日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

7.设置业务接口StudnetService

8.实现业务接口StudentServiceImpl类,在这里设置事务处理

package com.it.service.impl;import com.it.dao.StudentMapper;
import com.it.model.Student;
import com.it.service.StudentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class StudentServiceImpl implements StudentService {@Resourceprivate StudentMapper studentMapper;/*@Transactional:表示方法有事务的支持默认:使用数据库的隔离级别,传播行为:REQUIRED,超时时间:-1抛出运行时异常,回滚事务*/@Transactional@Overridepublic int addStudent(Student student) {System.out.println("业务方法addStudent");int i = studentMapper.insert(student);System.out.println("执行sql语句");//抛出一个运行时异常,目的是回滚事务
//        int m=10/0;return i;}
}

9.设置controller层的StudnetController类

package com.it.controller;import com.it.model.Student;
import com.it.service.StudentService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;@Controller
public class StudentController {@Resourceprivate StudentService studentService;@RequestMapping("/addStudent")@ResponseBodypublic String addStudent(String name,Integer age){Student student = new Student();student.setName(name);student.setAge(age);int i = studentService.addStudent(student);return "添加学生:"+i;}}

10.设置主入口函数的配置,添加mapper扫描注解和事务管理注解

package com.it;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** @EnableTransactionManagement:启用事务管理器*/
@SpringBootApplication
@EnableTransactionManagement
@MapperScan(basePackages = "com.it.dao")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

运行主函数进行测试

1.首先不在业务实现类编写算术异常,查看数据是否可以正常添加

2.现在添加上算术异常,查看是否发生事务回滚

成功抛出算数异常,查看数据库是否添加成功,如果数据没有添加成功,说明事务回滚成功。

刷新数据库表后,没有数据的加入,说明事务回滚成功。

15.在springboot中的事务处理相关推荐

  1. SpringBoot 中的事务处理 @Transactional

    一.什么是事务? 一个事务一旦其中有一个操作出现错误,事物的操作将全部回滚.系统将事务中对数据库的所有的已完成的操作全部撤消,回滚到事务开始的状态. 一个事务中的所有操作作为一个单元,要么完全地执行, ...

  2. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  3. Spring AOP及其在SpringBoot中的使用

    一.前言 本文简单介绍了Spring Aop的思想,以及部分基础概念,并且附带两个SpringBoot中简单的实例. 本文章中使用的环境及版本: 开发工具:Intellij IDEA 2017.3.4 ...

  4. 【SpringBoot】在SpringBoot中使用Ehcache

    SpringBoot提供了对缓存的支持,通过在启动类中添加@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者: ...

  5. springboot中的拦截器interceptor和过滤器filter,多次获取request参数

    大家好,我是烤鸭:     这是一篇关于springboot的拦截器(interceptor)和过滤器(Filter). 先说一下过滤器和拦截器. 区别: 1. servlet请求,顺序:Filter ...

  6. SpringBoot中的@ConfigurationProperties

    有什么用 该注解的作用类似于@Value,即为组件中的属性进行赋值. 怎么用 首先是建立一个springboot的工程,不再赘述. 首先我们建立一个Person类和一个Dog类. package co ...

  7. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)

    文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...

  8. SpringBoot中的定时任务的同步与异步

    SpringBoot中的定时任务的同步与异步你确定真的知道? 授人以渔 Java领域;架构知识;面试心得;互联网行业最新资讯 定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过 ...

  9. springBoot中shiro与Redis整合的配置文件

                                                                 springBoot中shiro与Redis整合的配置文件 整合依赖: < ...

最新文章

  1. 解读4G发牌事件,了解下4G那点事!
  2. aida64 extreme 序列号_轻声问海关,规范申报错了谁负责?底料来源四川行不行?没有公式定价行不行?序列号是料号行不行?...
  3. 一道关于Promise应用的面试题
  4. [CareerCup] 1.6 Rotate Image 翻转图像
  5. Mac系统打开dmg文件出现“资源忙”的解决方法
  6. LabVIEW自带函数实现SQL Server操作(下)
  7. openstack 开发_2016年OpenStack开发板工作清单
  8. 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
  9. python数据可视化的包怎么安装_数据可视化包 - matplotlib
  10. Query siblings()
  11. python 的异常及其处理
  12. 清空数据库中的某个表中数据
  13. C++ set find 找不到本来存在的元素
  14. SSIS常用的包—通用的属性
  15. 使用家庭宽带搭建服务器(含个人网盘) [一]-为什么要搭建自己的服务器?能实现公网访问?能实现NAS功能?能在线播放视频?
  16. Geometry-guided Kernel Transformer ——GKT代码复现
  17. 机械制图及计算机绘图试题库,101机械制图及计算机绘图1试题库..doc
  18. java lambda 画蛇添足_技术史上的画蛇添足: Redis HGETALL 排序问题
  19. 让我告诉你如何写一个优秀的广告文案
  20. 20201103_如何使用标识符?

热门文章

  1. Hadoop新手篇:hadoop入门基础教程 1
  2. 学计算机要数学和英语怎么说,高中数学和英语有点恼火。但本人大学想学计算机,就是不知道英语和数学与计算机专业有什么必要联络吗?...
  3. android 重复解绑服务,Android培训实战教程之多次解绑抛出异常原因
  4. springboot 佛祖保佑,永无bug
  5. 通过Windows7升级正版Windows10
  6. 项目管理——软件文档分类简介
  7. 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
  8. 经典车间生产调度问题模型及其算法 目录
  9. 如何给电脑安装双系统,电脑安装双系统教程
  10. 如何批量用扫描仪扫描照片_如何用手机扫描旧照片