SSM整合(五)
创始人
2024-02-07 15:23:40

SSM整合之事务管理(一)

1.核心准备工作

1.1 导入spring-tx依赖


org.springframeworkspring-tx5.3.22

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




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

package com.service;import java.io.Serializable;
import java.util.List;public interface BaseService {//mapper是单表的增删改查,impl业务实现层List findAll();List findAll(T t);//实现序列化的类都可以传 number类 StringT 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 implements BaseService {//浏览器-->控制器->业务层-->数据访问层(调用关系)//必须要有mapper接口,无就会注入失败@AutowiredMapper mapper;@Overridepublic List findAll() {return mapper.selectAll();}@Overridepublic List findAll(T t) {return mapper.select(t);}@Overridepublic T findById(Serializable id) {return mapper.selectByPrimaryKey(id);}@Overridepublic T findById(T t) {//查询单个对象return mapper.selectOne(t);}@Overridepublic boolean insert(T t) {//受影响行数return mapper.insertSelective(t)>0;}@Overridepublic boolean delete(Serializable id) {return mapper.deleteByPrimaryKey(id)>0;}@Overridepublic boolean update(T t) {return mapper.updateByPrimaryKeySelective(t)>0;}
}

4 写员工业务接口EmpService

package com.service;import com.entity.Emp;
//接口继承借口,类继承类
public interface EmpService extends BaseService{//属于员工转账业务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 implements EmpService {
}

6 事务管理

6.1 理由

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

6.2 如何用

6.2.1 逻辑错误

a 出现原因
当你查询不到任何结果时,返回的是null,对一个为null值的对象调用方法,必然会出现空指针异常
b 错误示例代码
b.1 转账方法
@Overridepublic 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 测试代码
 @Testpublic 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 转账方法
 @Overridepublic 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 测试方法
@Testpublic void t(){es.transfer(7369,7499,100);}
b.3 运行前的数据表截图

在这里插入图片描述

b.4 运行截图

在这里插入图片描述

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

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...