Spring Boot整合Mybatis及事务处理

article/2025/9/16 3:39:48

MyBatis为了方便与Spring Boot集成,专门提供了一个符合其规范的starter项目mybatis-spring-boot-starter。因此,我们只需在pom.xml添加相关依赖即可轻松集成。下面介绍了Spring Boot整合Mybatis的具体步骤以及事务使用(包含解决事务失效的坑),本项目依赖Spring Boot版本为2.X,mybatis为3.X。

1、mysql数据库准备

创建数据库mybatis,并创建sys_user表

CREATE TABLE `sys_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_name` varchar(50) DEFAULT NULL,`user_password` varchar(50) DEFAULT NULL,`user_email` varchar(50) DEFAULT NULL,`user_info` text,`head_img` blob,`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
)
INSERT INTO `sys_user` VALUES ('1', 'admin', '123456', '1009015337@qq.com', '管理员', null, '2019-06-12 14:44:59');
INSERT INTO `sys_user` VALUES ('2', 'test', '123456', 'test@mybatis.tk', '测试用户', null, '2019-06-11 13:56:03');

2、pom.xml中添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency>

3、application.properties

#数据源配置
spring.datasource.url=jdbc:mysql://XXXX:3306/mybatis?userUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=XXXX#mybatis配置
#映射文件的路径,多个配置可以使用英文逗号隔开
mybatis.mapperLocations=classpath:mapper/*.xml
#类型别名包配置,只能指定具体的包,多个配置可以使用英文逗号隔开
mybatis.typeAliasesPackage=com.henry.springboot.model
#日志等级
logging.level.com.henry.springboot.mapper=debug

4、logback.xml日志配置

<configuration><property name="APP_HOME" value="logs" /><!-- ch.qos.logback.core.ConsoleAppender 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger - %msg%n</pattern></encoder></appender><!-- 各类基本日志输出 --><appender name="file"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${APP_HOME}/common/log.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${APP_HOME}/logs/common/log-%d{yyyy-MM-dd}.%i.log</FileNamePattern><MaxHistory>10000</MaxHistory><TimeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><MaxFileSize>10GB</MaxFileSize></TimeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger - %msg%n</pattern></layout></appender><!-- 日志级别 --><root><level value="info" /><appender-ref ref="file" /><appender-ref ref="console" /></root></configuration>  

 至此配置已经基本完成(除mapper.xml文件),在写代码之前先看下项目结构:

 

5、项目代码

(1)mapper接口及配置

UserMapper类

package com.henry.springboot.mapper;import java.util.List;import org.springframework.transaction.annotation.Transactional;import com.henry.springboot.model.SysUser;public interface UserMapper {/*** 查询全部数据* * @return*/List<SysUser> selectAll();/*** 根据指定条件查询数据* @return*/SysUser selectById(Long id);/*** 插入记录* @param sysUser* @return*/int insert(SysUser sysUser);
}

在src/main/resources中新建mapper文件夹并创建UserMapper.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.henry.springboot.mapper.UserMapper"><select id="selectById" resultType="SysUser">select id, user_name userName,user_password userPassword,user_email userEmail,user_info userInfo,head_img headImg,create_time createTime from sys_user where id = #{id}</select><select id="selectAll" resultType="SysUser">select id, user_name userName,user_password userPassword,user_email userEmail,user_info userInfo,head_img headImg,create_time createTime from sys_user</select><insert id="insert">insert into sys_user(id, user_name, user_password, user_email, user_info, head_img, create_time) values(#{id}, #{userName}, #{userPassword}, #{userEmail}, #{userInfo}, #{headImg, jdbcType=BLOB},#{createTime, jdbcType=TIMESTAMP})</insert>
</mapper>

(2)服务层代码

服务接口UserService:

package com.henry.springboot.service;import java.util.List;import com.henry.springboot.model.SysUser;public interface UserService {SysUser findById(Long id);List<SysUser> findAll();void insert(SysUser sysUser) throws Exception;
}

 服务接口实现类:

package com.henry.springboot.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.henry.springboot.mapper.UserMapper;
import com.henry.springboot.model.SysUser;
import com.henry.springboot.service.UserService;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper UserMapper;@Overridepublic SysUser findById(Long id) {return UserMapper.selectById(id);}@Overridepublic List<SysUser> findAll() {return UserMapper.selectAll();}@Transactional(rollbackFor = Exception.class)@Overridepublic void insert(SysUser sysUser) throws Exception {int i = UserMapper.insert(sysUser);throw new Exception("发生异常了");}
}

(3)controller代码

UserController类

package com.henry.springboot.controller;import java.util.Date;
import java.util.List;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.henry.springboot.model.SysUser;
import com.henry.springboot.service.impl.UserServiceImpl;@RestController
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserServiceImpl userService;@RequestMapping("users/{id}")SysUser user(@PathVariable("id") Long id) {return userService.findById(id);}@RequestMapping("users")List<SysUser> user() {return userService.findAll();}@RequestMapping("insert")public String insert() {SysUser user = new SysUser();user.setUserName("test");user.setUserPassword("123456");user.setUserEmail("test@qq.com");user.setUserInfo("测试1");user.setHeadImg(new byte[] { 1, 2, 3 });user.setCreateTime(new Date());try {userService.insert(user);} catch (Exception e) {logger.error("", e);}return "success";}
}

(4)model层代码

SysUser类

package com.henry.springboot.model;import java.util.Date;public class SysUser {private Long id;private String userName;private String userPassword;private String userEmail;private String userInfo;private byte[] headImg;private Date createTime;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPassword() {return userPassword;}public void setUserPassword(String userPassword) {this.userPassword = userPassword;}public String getUserEmail() {return userEmail;}public void setUserEmail(String userEmail) {this.userEmail = userEmail;}public String getUserInfo() {return userInfo;}public void setUserInfo(String userInfo) {this.userInfo = userInfo;}public byte[] getHeadImg() {return headImg;}public void setHeadImg(byte[] headImg) {this.headImg = headImg;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}

6、运行

启动Spring Boot

(1)浏览器访问localhost:8080/users获取所有用户

(2)localhost:8080/users/1

7、事务处理
Spring Boot2.X事务处理非常简单,只需要在Service层添加@Transactional注解即可,上面代码中已经添加了。继续在浏览器中输入:localhost:8080/insert

后台:

 

数据库:

 

 数据中数据依旧是两条,可以看到数据并没有真正插入到数据库中,因为事务遇到异常回滚了。

8、事务处理中的坑

坑1:上面服务层的Transaction后面我们加了(rollbackFor = Exception.class),如果不加会怎么样呢?

我们去掉后重新运行项目后,浏览器继续访问localhost:8080/insert,再看项目后台及数据库:

 

 

 

数据库中记录插入成功了,事务回滚失败!

这是因为Spring的默认事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,显然throw new Exception("发生异常了");直接抛出不会进行事务回滚,但是可以在@Transactional注解中使用rollbackFor属性明确指定异常。

坑2:mysql的表是有事务安全( 比如:InnoDB)和非事务安全(比如:ISAM、MyISAM)之分的。如果自己的表是MyISAM类型的,那么久改为InnoDB,以支持事务处理。参见文章:https://blog.csdn.net/kaifaxiaoliu/article/details/79990357

最后附上该项目的下载地址:https://download.csdn.net/download/jcy1009015337/11290055,没有积分的私信我~~


http://chatgpt.dhexx.cn/article/GDtV62uA.shtml

相关文章

Mybatis-事务管理,事务配置

事务的特征– 1.原子性 事务是数据库的逻辑工作单位&#xff0c;事务中包括的所有操作&#xff0c;要么全做&#xff0c;要么全部做 2.一致性 事务执行的结果必须是使数据库从一个一致性状态飙到另一个一致性状态&#xff0c;一致性与原子性是密切相关 3.隔离性 一个事务的执行…

springboot+mybatis整合配置事务详解(^_^)

springboot集成mybatis有三种方式&#xff1a; 一、最简单的方式就是使用MyBatis官方提供的 mybatis-spring-boot-starter。 二、另一种使用spring-mybatis包的xml配置方式&#xff0c;这样需要自己写一些代码&#xff0c;但可以更灵活的控制mybatis的各项配置。 三、使用引…

第08篇:Mybatis事务处理

一、Jdk底层实现 Java JDK中提供了标准接口Connection,不同的数据库驱动负责具体的实现。后面无论是Spring还是Mybatis对事务的处理&#xff0c;无论怎么的封装,最终究其到底都是由Connection来提供的能力。 public interface Connection extends Wrapper, AutoCloseable { …

Mybatis中的事务提交

数据表不支持事务&#xff0c;mybatis会直接提交数据&#xff0c;即增删改不需要commit&#xff08;MyISAM引擎不支持事务&#xff09;&#xff1b; 数据表支持事务&#xff0c;默认mybatis需要手动提交事务&#xff0c;也可以设置为自动提交&#xff0c;如下 &#xff08;设…

Mybatis 的事务控制

事务&#xff1a;访问并可能更新数据库中各种数据项的一个程序执行单元(unit) 事务的四个特性&#xff1a;原子性、一致性、隔离性、持久性 不考虑隔离性的三个问题&#xff1a;丢失修改、不可重复读&#xff0c;读脏数据 解决办法&#xff1a;四种隔离级别文章目录 一、Mybati…

Mybatis深入之事务管理

Mybatis之事务管理 简介 Mybatis的事务管理分为两种JdbcTransaction&#xff0c;ManagedTransaction。其中JdbcTransaction仅仅是对数据库连接Connection的一个包装、内部管理数据库事务还是调用Connection的提交、回滚等事务操作方法。ManagedTransaction更直接、什么也没有…

事务-2 Spring与Mybatis事务实现原理

背景&#xff1a; 本文承接事务-1 事务隔离级别和Spring事务传播机制&#xff0c;是事务专题的第二篇&#xff1b;主题内容是Mybatis和Spring事务原理&#xff0c;结合源码和案例进行介绍。 本文主题内容为事务原理, 尤重Spring事务原理; 会结合源码讲解整体流程, 但不会拘限于…

什么是事务?Mysql事务怎么用?Mybatis怎么操作事务的?Spring呢?快进来看看

目录 一、计算机中的事务 1. 概念 2.事务的ACID特性 3.事务类型 1)手动事务 2)自动事务 4.为什么需要事务? 5.优点 二、MySQL事务 1.语法格式: 2.关闭自动提交&#xff0c;开启新事务 3.开启自动提交&#xff0c;关闭事务控制 三、Mybatis事务 Mybatis开关事务控…

SpringBoot Mybatis事物管理

本文主要讲述springboot提供的声明式的事务管理机制。 一、一些概念 声明式的事务管理是基于AOP的&#xff0c;在springboot中可以通过Transactional注解的方式获得支持&#xff0c;这种方式的优点是&#xff1a; 1&#xff09;非侵入式&#xff0c;业务逻辑不受事务管理代码…

spring boot配置mybatis和事务管理

spring boot配置mybatis和事务管理 一、spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下&#xff1a; <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>s…

《深入理解mybatis原理》 MyBatis事务管理机制

MyBatis作为Java语言的数据库框架&#xff0c;对数据库的事务管理是其非常重要的一个方面。本文将讲述MyBatis的事务管理的实现机制。首先介绍MyBatis的事务Transaction的接口设计以及其不同实现JdbcTransaction 和 ManagedTransaction&#xff1b;接着&#xff0c;从MyBatis的…

MyBatis事务管理

一、概述 事务管理对于企业应用来说是至关重要的&#xff0c;即使出现异常情况&#xff0c;它也可以保证数据的一致性。 Spring Framework对事务管理提供了一致的抽象&#xff0c;其特点如下&#xff1a; 为不同的事务API提供一致的编程模型&#xff0c;比如JTA(Java Transac…

深入浅出Mybatis系列(五)Mybatis事务篇

在学习Mysql事务开始,分为两步。一.先看下Mysql的事务级别都有什么,然后看Mysql的事务级别设置命令。及常见问题。二.JDK是如何处理数据库操作的呢? Mybatis是如何实现JDK定义的事务级别操作。 一.Mysql的事务级别及常见概念 MySQL事务隔离级别 事务隔离级别脏读不可重复读幻…

详解 MyBatis 事务管理,彻底颠覆你对事务的理解!

来源&#xff1a;https://my.oschina.net/zudajun/blog/666764 前言 说到数据库事务&#xff0c;人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大还好说&#xff0c;问题是七大传播特性是哪儿来的&#xff1f;是 Spring 在当前线程内&…

MyBatis的事务

Mybatis管理事务是分为两种方式: (1)使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交 (2)使用MANAGED的事务管理机制&#xff0c;这种机制mybatis自身不会去实现事务管理&#xff0c;而是让程序的容器&#xff08;JBOSS,WebLogic&#xff09;来实现对…

MyBatis--事务

事务是基于关系型数据库的企业应用的重要组成部分&#xff0c;用来确保应用程序数据的完整性和一致性。 事务就是一个系列(一组、几个)操作的集合单元&#xff0c;这些操作要么全部完成&#xff0c;要么全部失败&#xff0c;如果某一个操作失败&#xff0c;就算是已经成功执行…

ResNet网络结构解析

ResNet是识别、检测中常用的backbone&#xff0c;看检测相关论文的时候重点都在方法创新上&#xff0c;并没有特别在意网络结构&#xff0c;但是到自己跑实验改网络的时候就涉及到结构细节问题&#xff0c;于是详细的看了下ResNet网络结构。下图是ResNet的网络结构简图&#xf…

resnet网络结构图

很重要&#xff0c;单独放

ResNet网络结构,BN以及迁移学习详解

网络中的亮点&#xff1a; 1.超深的网络结构&#xff08;超过1000层&#xff09; 2.提出residual(残差)模块 3.使用Batch Normalization加速训练&#xff08;丢弃dropout&#xff09; 左边是将卷积层和池化层进行一个简单的堆叠所搭建的网络结构 20层的训练错误率大概在1%…

ResNet网络结构详解(Tensorflow2.6.0实现网络结构)

文章目录 1.ResNetX网络结构表&#xff08;1&#xff09;论文地址&#xff1a;&#xff08;2&#xff09;ResNet18网络结构&#xff1a;&#xff08;3&#xff09;ResNet34网络结构&#xff1a; 2.卷积神经网络的发展(1).卷积神经网络的发展&#xff1a;&#xff08;2&#xff…