系列十五、Spring5编程式事务

一、业务代码

1.1、pom

<dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.27</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.1.0</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.2.5.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.16</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><!-- 普通maven项目中使用Sl4j注解 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.10</version></dependency></dependencies>

1.2、实体

1.2.1、UserDO

package org.star.entity.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** @Author:* @Date: 2023/8/28 16:51* @Description:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDO implements Serializable {/*** 编号*/private Integer id;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 手机号码*/private String mobile;/*** 用户状态(0启用、1禁用)*/private Integer status;
}

1.2.2、RoleUserDO

package org.star.entity.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** @Author : 一叶浮萍归大海* @Date: 2023/8/28 21:38* @Description:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RoleUserDO implements Serializable {/*** 用户ID*/private Integer uId;/*** 角色ID*/private Integer rId;/*** 删除标识(0未删除、1已删除)*/private Integer deleted;
}

1.3、mapper

1.3.1、UserMapper.xml

package org.star.mapper;import org.star.entity.model.UserDO;import java.util.List;/*** @Author:* @Date: 2023/8/28 16:53* @Description:*/
public interface UserMapper {/*** 查询所有用户信息* @return*/List<UserDO> listAllUser();/*** 根据ID查询用户* @param id 用户ID* @return*/UserDO getUserById(Long id);/*** 禁用用户* @param id 用户ID* @return*/boolean disableUser(Integer id);}

1.3.2、RoleUserMapper.xml

package org.star.mapper;/*** @Author : 一叶浮萍归大海* @Date: 2023/8/28 21:45* @Description:*/
public interface RoleUserMapper {/*** 根据用户ID删除角色* @param uId* @return*/boolean delUserRole(Integer uId);}

1.4、UserService

package org.star.service;import com.github.pagehelper.PageInfo;
import org.star.entity.model.UserDO;import java.util.List;/*** @Author: 一叶浮萍归大海* @Date: 2023/8/28 17:41* @Description:*/
public interface UserService {/*** 查询所有用户信息** @return*/List<UserDO> listAllUser();/*** 分页查询用户信息* @param pageNum   当前页码* @param pageSize  每页显示的记录数* @return*/PageInfo<UserDO> pageUser(int pageNum, int pageSize);/*** 禁用用户* @param uId 用户ID* @return*/boolean disableUser(Integer uId);
}

1.5、UserServiceImpl

package org.star.service.impl;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.star.entity.model.UserDO;
import org.star.mapper.RoleUserMapper;
import org.star.mapper.UserMapper;
import org.star.service.UserService;import javax.annotation.Resource;
import java.util.List;/*** @Author: 一叶浮萍归大海* @Date: 2023/8/28 17:41* @Description:*/
@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate RoleUserMapper roleUserMapper;@Resourceprivate DataSourceTransactionManager transactionManager;@Overridepublic List<UserDO> listAllUser() {return userMapper.listAllUser();}@Overridepublic PageInfo<UserDO> pageUser(int pageNum, int pageSize) {// 设置当前页码以及每页显示的记录数PageHelper.startPage(pageNum,pageSize);// 执行查询List<UserDO> userDOS = userMapper.listAllUser();// 设置pageInfo对象PageInfo<UserDO> pageInfo = new PageInfo<>(userDOS);return pageInfo;}/*** 正常情况下,事务全部提交* @param uId 用户ID* @return*/@Overridepublic boolean disableUser(Integer uId) {TransactionDefinition td = new DefaultTransactionDefinition();TransactionStatus transactionStatus = transactionManager.getTransaction(td);try {// 1、禁用当前用户boolean disableResult = userMapper.disableUser(uId);// 两个操作之前模拟异常,看事务是否会回滚int i = 10 /0;// 2、删除用户关联的角色信息boolean delResult = roleUserMapper.delUserRole(uId);// 提交事务transactionManager.commit(transactionStatus);if (disableResult && delResult) {return true;}} catch (Exception e) {// 回滚事务transactionManager.rollback(transactionStatus);}return false;}
}

二、配置信息

2.1、jdbc.properties

db.driverClass=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/20230828_spring5?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
db.username=root
db.password=123456

2.2、applicationContext.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--组件扫描--><context:component-scan base-package="org.star"></context:component-scan><context:property-placeholder location="jdbc.properties"></context:property-placeholder><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${db.driverClass}"></property><property name="url" value="${db.url}"></property><property name="username" value="${db.username}"></property><property name="password" value="${db.password}"></property></bean><!--配置sqlSessionFactory,注入相关属性--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="typeAliasesPackage" value="org.star.entity.model"></property><property name="mapperLocations" value="classpath:mapper/*.xml"></property><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"></property></bean></property><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--reasonable=true解释:如果用户输入的不合理的pageSize参数,pageHelper会自动进行调整--><value>helperDialect=mysqlreasonable=true</value></property></bean></array></property></bean><!--配置mapper的位置,并指定sqlSessionFactorysqlSession = sqlSessionFactory.openSession();mapper = sqlSession.getMapper();--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="org.star.mapper"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>
</beans>

三、测试

3.1、AppTest

package org.star;import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.star.entity.model.UserDO;
import org.star.mapper.UserMapper;
import org.star.service.UserService;
import org.star.service.impl.UserServiceImpl;import java.util.List;/*** Unit test for simple App.*/
@Slf4j
public class AppTest {private ClassPathXmlApplicationContext context = null;@Beforepublic void initApplicationContext() {context = new ClassPathXmlApplicationContext("applicationContext.xml");}// ================================= service test ================================@Testpublic void txTest() {UserService userService = context.getBean(UserServiceImpl.class);boolean result = userService.disableUser(1);log.info("result:{}", result);}@Testpublic void pageUserTest() {UserService userService = context.getBean(UserServiceImpl.class);PageInfo<UserDO> pageInfo = userService.pageUser(1, 10);log.info("pageInfo:{}", JSON.toJSONString(pageInfo));}// ================================= mapper test =================================@Testpublic void getUserByIdTest() {UserMapper userMapper = context.getBean(UserMapper.class);UserDO userDO = userMapper.getUserById(1L);log.info("userDO", JSON.toJSONString(userDO));}@Testpublic void listAllUserTest() {userMapperTest();// userServiceTest();}private void userServiceTest() {UserService userService = context.getBean(UserServiceImpl.class);List<UserDO> userDOS = userService.listAllUser();System.out.println("userService userDOS = " + userDOS);}private void userMapperTest() {UserMapper userMapper = context.getBean(UserMapper.class);List<UserDO> userDOS = userMapper.listAllUser();System.out.println("userMapper userDOS = " + userDOS);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux--VMware的安装和Centos

一、VMware和Linux的关系 二、VMware的安装 VM_ware桌面虚拟机 最新中文版 软件下载 (weizhen66.cn) VMware-Workstation-Lite-16.2.2-19200509-精简安装注册版.7z - 蓝奏云 如果安装不成功&#xff0c;则设置BIOS 三、在VMware中加入Centos 下载地址&#xff1a; CentOS-…

Linux 忘记密码解决方法

很多朋友经常会忘记Linux系统的root密码&#xff0c;linux系统忘记root密码的情况该怎么办呢&#xff1f;重新安装系统吗&#xff1f;答案是不需要进入单用户模式更改一下root密码即可。 步骤如下&#xff1a; 重启linux系统 3 秒之内要按一下回车&#xff0c;出现如下界面 …

unity-AI自动导航

unity-AI自动导航 给人物导航 一.地形创建 1.首先我们在Hierarchy面板中创建一个地形对象terrian&#xff0c;自行设定地形外貌&#xff0c;此时我们设置一个如下的地形外观。 二.创建导航系统 1.在主人公的Inspector、面板中添加Nav Mesh Agent &#xff08;导航网格代理&…

Linux操作系统--linux概述

1.Linux概述 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff08;OS&#xff09;。简单的说就是一种操作系统。在日常中常见的操作系统有一下三种: 2.linux起源和背景 (1).linux的诞生 linux操作系统是由李纳斯托瓦兹&#xf…

C++ 多重继承

所谓多重继承就是一个儿子有好几个爹&#xff0c;然后一个人继承了这几个爹的财产。只需注意构造顺序即可&#xff0c;反正析构的顺序也是一样的。 #include <iostream> #include <string.h> using namespace std;class base_a { public:base_a(const char *str){…

二十、观察者模式

一、什么是观察者模式 观察者&#xff08;Observer&#xff09;模式的定义&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&…

2007-2022年上市公司污染排放数据/2007-2022年上市公司污染排放水平、污染排放量数据

2007-2022年上市公司污染排放数据/2007-2022年上市公司污染排放水平、污染排放量数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;证券代码、year、化学需氧量、氨氮排放量、总氮、总磷、水体综合污染当量对数、二氧化硫、氮氧化物、烟尘、空气综合污染当量对数、总…

代码中的3种错误-思考及应对方法

我们聊到了代码中的3中错误。今天我想在具体的代码上讨论如何应对这3中错误。 这段代码很普通&#xff0c;就是在浏览器中自动下载文件&#xff0c;代码如下&#xff1a; const link document.createElement(a) link.href dataUrl link.download output.png link.click()这…

静态类方法的同步

由于在调用静态方法时&#xff0c;对象实例不一定被创建。因此&#xff0c;就不能使用this来同步静态方法&#xff0c;而必须使用Class对象来同步静态方法。代码如下&#xff1a; 通过synchronized块同步静态方法 public class StaticSyncBlock { public static void…

还只是听说过Generator函数?那就来全面了解它吧

Generator函数 基本概念 Generator函数时ES6提供的一种异步编程解决方案&#xff1b; 一、语法上&#xff1a; 可以理解为一个状态机&#xff0c;封装了多个内部状态执行Generator函数会返回一个遍历器对象 二、形式上的特点&#xff1a; function命令和函数名之间有一个…

word表格左侧边线明明有,但却不显示

如题&#xff0c;解决方法&#xff1a; 方案一&#xff1a; 1&#xff09;选中表格 2&#xff09;布局菜单--->自动调整 3&#xff09;自动调整中&#xff0c;选择“根据窗口自动调整表格” 4&#xff09;表格左侧边线就显示出来了。 方案二&#xff1a;把表格粘贴到新…

Kubernetes技术--Kubernetes架构组件以及核心概念

1.Kubernetes集群架构组件 搭建一个Kubernetes环境集群,其架构如下所示: 内容详解: Master:控制节点,指派任务、决策 Node:工作节点,实际干活的。 Master组件内容:

国产芯片设备达到3纳米,还打入台积电,美日荷被彻底赶出市场

由于众所周知的原因&#xff0c;荷兰和日本的光刻机对中国供应面临限制&#xff0c;其他芯片设备和材料也受到很大的限制&#xff0c;这促使国产芯片产业链积极完善&#xff0c;以实现纯国产芯片工艺&#xff0c;虽然在光刻机方面还稍微落后&#xff0c;不过有一项国产芯片设备…

day-03 基于TCP的服务器端/客户端

一.理解TCP和UDP TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种常见的传输层协议&#xff0c;用于在计算机网络中提供可靠的数据传输。 1.TCP&#xff1a; 连接导向&#xff1a;TCP是一种面向连接的…

Android深思如何防止快速点击

前言 其实快速点击是个很好解决的问题&#xff0c;但是如何优雅的去解决确是一个难题&#xff0c;本文主要是记录一些本人通过解决快速点击的过程中脑海里浮现的一些对这个问题的深思。 作者&#xff1a;流浪汉kylin 链接&#xff1a;https://juejin.cn/post/7197337416096055…

Cookie中的SameSite标示是什么

目录 背景介绍 原理 MDN上有比较完整的描述 如何确定cookie是否已经设置相关属性 背景介绍 SameSit

Numerical Calculation 数值计算

Numerical Calculation 数值计算 数值计算第一次实验(C语言版) C语言编程常用数值计算的高性能实现 /* 高位全0&#xff0c;低N位全1 */ #define Low_N_Bits_One(N) ((1<<N) -1)/* 高位全1&#xff0c;低N位全0 */ #define Low_N_Bits_Zero(N) (~((1<<N)…

Mac 卸载 PyCharm 方法

Mac 系统下 PyCharm 没有一键卸载程序&#xff0c;也没有完全卸载的插件&#xff0c;若要彻底删除&#xff0c;除了在应用&#xff08;Application&#xff09;里删除 PyCharm 到垃圾桶外&#xff0c;还需要在终端&#xff08;Terminal&#xff09;执行删除相应的文件及文件夹。…

vue3+ts封装弹窗,分页封装

定义defaultDialog .vue <script lang"ts" setup> import { ref,toRefs,onUpdated } from vue import { ElMessageBox } from element-plus const props defineProps({//接收参数&#xff0c;父组件传的时候用:msg123的形式msg:String,show:{type:Boolean,defa…

Cesium Entity、dataSource添加与删除

Cesium Entity、dataSource添加与删除 一、Entity1. 添加实体2. 获取实体3. 删除实体 二、dataSource1. 添加数据源&#xff1a;2. 删除数据源 一、Entity 在Cesium中&#xff0c;要添加和删除实体和数据源可以使用以下代码&#xff1a; 1. 添加实体 var entity viewer.ent…