SSM整合(五)

news2024/11/30 12:53:37

SSM整合之事务管理(一)

1.核心准备工作

1.1 导入spring-tx依赖

<!-- 事务spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.22</version>
</dependency>

1.2 创建实体类

package com.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
//属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空
public class Emp{
    @Id
    //导入的是javax.persistence下的
    @KeySql(useGeneratedKeys = true)//主键回填
    private Integer empno;
    private String ename;
    private String mgr;
    private String job;
    private String hiredate;
    private Double sal;
    private Double comm;
    private Integer deptno;
}

1.3 创建spring-tx.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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
     <!--创建事务管理器 通过Jdbc方式-->
     <bean id="tm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"></property>
     </bean>
    <!--开启注解事务 选tx结尾的 报错后就回滚-->
    <tx:annotation-driven transaction-manager="tm"></tx:annotation-driven>
</beans>

2 创建通用业务 BaseService(给实现子类提供方法)

package com.service;

import java.io.Serializable;
import java.util.List;

public interface BaseService<T> {
    //mapper是单表的增删改查,impl业务实现层
    List<T> findAll();
    List<T> findAll(T t);
    //实现序列化的类都可以传 number类 String
    T findById(Serializable id);
    T findById(T t);
    boolean insert(T t);
    boolean delete(Serializable id);
    boolean update(T t);
}

3 创建通用业务实现子类BaseServiceImpl

package com.service.impl;

import com.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;

import java.io.Serializable;
import java.util.List;

//该类仅为子类提供公共的增删改查业务方法
public  abstract class BaseServiceImpl<T> implements BaseService<T> {
    //浏览器-->控制器->业务层-->数据访问层(调用关系)
    //必须要有mapper接口,无就会注入失败
    @Autowired
    Mapper<T> mapper;
    @Override
    public List<T> findAll() {
        return mapper.selectAll();
    }

    @Override
    public List<T> findAll(T t) {
        return mapper.select(t);
    }

    @Override
    public T findById(Serializable id) {
        return mapper.selectByPrimaryKey(id);
    }

    @Override
    public T findById(T t) {
        //查询单个对象
        return mapper.selectOne(t);
    }

    @Override
    public boolean insert(T t) {
        //受影响行数
        return mapper.insertSelective(t)>0;
    }

    @Override
    public boolean delete(Serializable id) {
        return mapper.deleteByPrimaryKey(id)>0;
    }

    @Override
    public boolean update(T t) {
        return mapper.updateByPrimaryKeySelective(t)>0;
    }
}

4 写员工业务接口EmpService

package com.service;

import com.entity.Emp;
//接口继承借口,类继承类
public interface EmpService extends BaseService<Emp>{
    //属于员工转账业务
    void transfer(int account1, int account2, int money);
}

5 创建员工业务的实现类EmpServiceImpl

package com.service.impl;
import com.entity.Emp;
import com.service.BaseService;
import com.service.EmpService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Service
public class EmpServiceImpl extends BaseServiceImpl<Emp> implements EmpService {
}

6 事务管理

6.1 理由

因为mysql数据库默认是自动提交事务的,程序出现错误并不会自动回滚
而在一个事务中,当程序发生错误的时候,我们希望回滚到最初的状态,
所以就需要进行事务管理

6.2 如何用

6.2.1 逻辑错误

a 出现原因
当你查询不到任何结果时,返回的是null,对一个为null值的对象调用方法,必然会出现空指针异常
b 错误示例代码
b.1 转账方法
@Override
    public void transfer(int account1, int account2, int money) {
            Emp emp1 = findById(account1);
            Emp emp2 = findById(account2);
            //转账
            emp1.setSal(emp1.getSal()-money);
            emp2.setSal(emp2.getSal()+money);
            //修改数据库
            mapper.updateByPrimaryKeySelective(emp1);
            mapper.updateByPrimaryKeySelective(emp2);
    }
b.2 测试代码
 @Test
    public void t99(){
        //需要保证一致性
       es.zz(99980,7499,100);
    }
b.3 运行截图

在这里插入图片描述

b.4 解决方案(执行后面逻辑前加判断)
if(emp1==null) throw new RuntimeException(account1+"账号不存在");
if(emp2==null) throw new RuntimeException(account2+"账号不存在");

6.2.2 运行时错误

a 解决方案

在类上面加上@Transactional注解
在这里插入图片描述

b 示例代码
b.1 转账方法
 @Override
    public void transfer(int account1, int account2, int money) {
            Emp emp1 = findById(account1);
            Emp emp2 = findById(account2);
           if(emp1==null) throw new RuntimeException(account1+"账号不存在");
           if(emp2==null) throw new RuntimeException(account2+"账号不存在");
            //转账
            emp1.setSal(emp1.getSal()-money);
            emp2.setSal(emp2.getSal()+money);
            //修改数据库
            mapper.updateByPrimaryKeySelective(emp1);
            System.out.println(1/0);
            mapper.updateByPrimaryKeySelective(emp2);
    }
b.2 测试方法
@Test
    public void t(){
       es.transfer(7369,7499,100);
    }
b.3 运行前的数据表截图

在这里插入图片描述

b.4 运行截图

在这里插入图片描述

b.5 运行后的数据表截图

在这里插入图片描述

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

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

相关文章

【附源码】计算机毕业设计JAVA研究生招生信息管理

【附源码】计算机毕业设计JAVA研究生招生信息管理 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA …

旧苹果短信导入新苹果手机上,iphone短信迁移

概述&#xff1a;随着科技的快速发展&#xff0c;手机的更新换代周期也变得越来越短。那么问题来了&#xff1a;旧苹果短信导入新苹果手机上&#xff1f;相信这是新机主心中的痛点&#xff0c;那么今天小编就来教大家如何解决这个问题。 方法一、使用易我手机数据传输软件转移苹…

D0x-17(anti—Sp17)-3C12/TPGS抗精子蛋白单克隆抗体/维生素E聚乙二醇琥珀酸酯偶联阿霉素研究

下面分享了D0x-17(anti—Sp17)-3C12/TPGS抗精子蛋白单克隆抗体/维生素E聚乙二醇琥珀酸酯偶联阿霉素研究方法&#xff0c;来看&#xff01; D0x-TPGS聚乙二醇1000维生素E琥珀酸酯(TPGS)修饰阿霉素研究方法&#xff1a; 用硫酸铵梯度法制备TPGS修饰的阿霉素脂质体,并对其理化性质…

try/catch/finally的各种情况

众所周知&#xff0c;try语句报错&#xff0c;会执行catch语句&#xff0c;然后执行finally&#xff0c;以下这几种情况&#xff0c;看看会如何输出。 1、try语句中包含return&#xff0c;finally包含输出语句 public static void main(String[] args) {// write your code h…

YOLOX代码、预测(使用摄像头实时预测)及其添加SE注意力前后的实验结果

1. 代码获取 https://github.com/Le0v1n/ml_code/tree/main/ObjectDetection/YOLOX 如果代码对你有用&#xff0c;请star一下❤️ 2. 预测 2.1 图片预测 下载权值文件&#xff1a;https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth将权…

iOS键盘通知弹框使用小结

项目开发中文本框输入的时候经常会用到键盘弹框遮挡的问题。解决办法就是根据底部键盘弹出的高度动态的改变对应view的位置。这里以多行文本框输入为例&#xff0c;效果图如下。 //第一步&#xff0c;注册监听键盘通知 [[NSNotificationCenter defaultCenter] addObserver:self…

只会 Python 不行,不会 Python 万万不行

当下的环境大家有目共睹&#xff0c;未来一段时间情况如何&#xff0c;想必不少人心里也清楚&#xff0c;技术人走到中年&#xff0c;难免会焦虑&#xff0c;职场上干得不爽&#xff0c;但是跳槽也不容易&#xff0c;加上不少企业裁员&#xff0c;换个满意的工作更是难上加难。…

JavaScript——周技能检测——菜单编辑——2022年11月22日(考完)

JavaScript——周技能检测——菜单编辑——2022年11月22日&#xff08;考完&#xff09; 一、语言和环境 1. 实现语言&#xff1a;JavaScript。 2. 开发环境&#xff1a;VScode。 二、要求 1、在文本框中输入两个操作数和选择运算符后&#xff0c;在页面上显示输出结果。 …

电影《名侦探柯南:万圣节的新娘》观后感

上周看了电影《名侦探柯南&#xff1a;万圣节的新娘》&#xff0c;讲述了一场即将发生在东京涉谷的爆炸案件&#xff0c;引来各方的关注&#xff0c;柯南在参与案件的过程中&#xff0c;找出真凶的故事。 故事属于侦探类&#xff0c;有悬疑反转等要素&#xff0c;还是挺好的。不…

推荐系统实战3——推荐系统中Embedding层工作原理浅析

推荐系统实战3——推荐系统中Embedding层工作原理浅析学习前言什么是Embedding一、为什么要有Embedding二、推荐系统中常见的Embedding处理方式1、字符串形式的输入2、连续值&#xff08;特定范围值&#xff09;的输入三、Embedding的注意点学习前言 Embedding层是推荐系统特征…

盘点一下今年世界杯中国赞助商及联名入圈品牌

作为全世界的超级体育赛事&#xff0c;今年世界杯的ip流量无疑是值得期待的。虽然中国球队缺席&#xff0c;但中国赞助的热情是丝毫不减&#xff0c;中国官方合作伙伴&#xff08;赞助商&#xff09;分别是蒙牛、海信、vivo和万达。除了万达&#xff0c;其余三大品牌都是来自各…

护眼灯真的可以护眼吗?2022护眼台灯该怎样选择

或许很多人看过一些报道&#xff0c;认为护眼灯是智商税&#xff0c;并不能护眼&#xff0c;但是&#xff0c;我们并不能因为一两款劣质灯具的不行就否定整个行业的产品&#xff0c;真正高质量的护眼灯&#xff0c;并没有像相关报道说的那样不堪&#xff0c;相反其光线对人眼具…

微信小程序商城迅速流行的决定因素

随着互联网的不断发展壮大&#xff0c;许多人更倾向于线上购物&#xff0c;享受到足不出户就能送货上门的购物体验&#xff0c;这使得线上商城占据了优势。而微信小程序商城更是广受好评。 小程序商城的经营模式在很大程度上契合了当下的消费需求和消费心理。它的情感链接&…

JavaScript开发工具WebStorm入门教程:如何安装WebStorm

WebStorm是jetbrains旗下一款JavaScript 开发工具&#xff0c;被广大JS开发者誉为"Web前端开发神器""最强大的HTML5编辑器""最智能的JavaSscript IDE"。 本文给大家讲解WebStorm的安装教程&#xff0c;欢迎下载最新版产品体验&#xff01; Web…

算法多重要你还不知道吗?字节大佬把LeetCode前400题的解答笔记都整理好了,头发大佬掉,我们跟着吃经验!

你知道现在LeetCode算法在大厂中的重要性吗&#xff1f; 前几天小编看了一个国内算法大神的短视频&#xff0c;他就在视频中指出了算法对当下无论是生活还是找工作中都是非常重要的&#xff01; 没错这个人就是江湖人称“左神”的左程云老师 小编也简单看了一下一些比较知名互…

定语从句------六级

1.复合句/从句三大类 从句在整个句子中做什么成分&#xff0c;就叫什么从句。 形容词性从句&#xff1a;定语从句&#xff0c;带有谓语的完整的结构在另一个句子中做定语 名词性从句 副词性从句&#xff1a;状语从句 从句典型的标志&#xff0c;带有关系词2.定语从句&#xff1…

selenium⾃动化测试⾯试题及答案,看看你会多少?

说到UI自动化&#xff0c;可能大家和我一样&#xff0c;主要是用Selenium。毕竟Selenium可是UI自动化方面的王者。 而且Selenium 支持多平台&#xff0c;可以模拟真实浏览器&#xff0c;也支持多种浏览器&#xff0c;免费开源&#xff0c;对商业用户也没有任何限制&#xff0c…

分布式任务调度项目xxl-job

xxl-job简介 分布式任务调度项目xxl-job的官网&#xff1a;分布式任务调度平台XXL-JOB 大众点评的分布式任务调度平台&#xff0c;是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c…

【2012】408联考数据结构真题整理

2012年 1 题目 解析 递归 2 题目 答案&#xff1a;A 解析 3 题目 解析 4 题目 答案&#xff1a;B 解析 T1&#xff1a;1T2&#xff1a;2T3&#xff1a;2 1 1 4T4&#xff1a;T3 T2 1 2 4 1 7T5&#xff1a;T4 T3 1 7 4 1 12T6&#xff1a;T5 T4 1 …

Mac M1 Datasophon 安装

Mac M1 Datasophon 安装 什么是 Datasophon DataSophon 是致力于自动化监控、运维、管理大数据基础组件和节点的&#xff0c;帮助您快速构建起稳定&#xff0c;高效的大数据集群服务。 网络要求 要求各机器各组件正常运行提供如下的网络端口配置&#xff1a; 组件默认端口…