SpringBoot事务-调度-缓存

一.Spring Boot中的事务管理


  • 设置事务
    • @Transactional(isolation = Isolation.DEFAULT)
    • @Transactional(propagation = Propagation.REQUIRED)
  • 开启事务
    • @EnableTransactionManagement

整合springboot、mybatis-plus、lombok做了对顾客的简单的事务管理

代码演示:

1. 导入对应的依赖
java 复制代码
<dependencies>
    <!--spring+springMVC-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
2. 编写实体类Consume
java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("consume")
public class Consume {
    @TableId(value = "cust_id" ,type = IdType.AUTO)
    private int custId;
    @TableField("cust_address")
    private String custAddress;
    @TableField("cust_level")
    private String custLevel;
    @TableField("cust_name")
    private String custName;
    @TableField("cust_phone")
    private String custPhone;

}
3. 新建一个mapper包,在包里新建一个ConsumeMapper接口
java 复制代码
@Mapper
public interface ConsumeMapper  extends BaseMapper<Consume> {

}
4. 编写业务层代码以及实现类
java 复制代码
public interface ICustomerService extends IService<Consume> {

    public void batchAdd();

}
java 复制代码
@Service
public class CustomerServiceImp extends ServiceImpl<ConsumeMapper, Consume> implements ICustomerService {

    @Resource
    private ConsumeMapper mapper;
    
    @Transactional
    @Override
    public void batchAdd() {
        mapper.insert(new Consume(1,"台湾君越酒店","五星级","佩洛西1","12345678"));
        int a = 10/0;
        mapper.insert(new Consume(2,"台湾君越酒店","五星级","佩洛西1","12345678"));
        mapper.insert(new Consume(3,"台湾君越酒店","五星级","佩洛西1","12345678"));

    }
}

注意:在业务层的实现类添加了@Transactional注解,进行了事务管理

5. 编写控制层代码
java 复制代码
@RestController
public class CustomerControllerImp {

    @Autowired
    private ICustomerService service;

    @RequestMapping("/add")
    public String batchAdd() {
        service.batchAdd();
        return "成功";
    }
}
6. 测试代码
java 复制代码
@SpringBootApplication
@EnableTransactionManagement
public class Springboot01CenterTxApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot01CenterTxApplication.class, args);
    }

}

注意:在测试代码中一定要开启事务管理,

开启事务管理的注解:@EnableTransactionManagement

7. 测试结果:

观察结果我们会发现页面上会显示成功,同时我们会发现数据库表中也会新增三条数据

此时我们开启事务管理,同时模拟一个除0错的异常,我们继续观察结果会发现页面上会报错(500),同时数据库表中也只会新增模拟异常之前的一条数据

二、Spring Boot异步任务


在项目开发中,绝大多数情况下都是通过同步方式处理业务逻辑的,但是比如批量处理数据,批量发送邮件,批量发送短信等操作容易造成阻塞的情况,之前大部分都是使用多线程来完成此类任务而在Spring 3+之后,就已经内置了@Async注解来完美解决这个问题,从而提高效率。

  • 使用的注解
    • @EnableAsync 启动类上开启基于注解的异步任务
    • @Async 标识的方法会异步执行

代码演示:

1.ICustomerService
java 复制代码
public interface ICustomerService {

    public void batchAdd();

}
2.CustomerServiceImp
java 复制代码
@Service
public class CustomerServiceImp implements ICustomerService{


    @Override
    @Async
    public void batchAdd() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("======>批量新增");
    }
}

注意:在方法上标@Async注解,表示该方法异步执行

3.CustomerControllerImp
java 复制代码
@RestController
public class CustomerControllerImp {

    @Autowired
    private ICustomerService service;

    @RequestMapping("/add")
    public String batchAdd() {
        service.batchAdd();
        return "成功";
    }
}

4.测试代码

java 复制代码
@SpringBootApplication
@EnableAsync//开启异步处理
public class Springboot02CenterAysncApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot02CenterAysncApplication.class, args);
    }

}

注意:在测试代码中一定要开启异步处理,

开启异步处理的注解:@EnableAsync

5.测试结果:

观察结果我们会发现页面上会显示成功,同时我们会发现控制台有输出结果

三.SpringBoot定时任务调度


SpringTask

在项目开发中,经常需要执行一些定时任务,比如 每月1号凌晨需要汇总上个月的数据分析报表; 每天 凌晨分析前一天的日志信息等定时操作。Spring 为我们提供了异步执行定时任务调度的方式

  • 使用的注解
    • @EnableScheduling启动类上开启基于注解的定时任务
    • @Scheduled标识的方法会进行定时处理 需要通过 cron 属性来指定 cron 表达式:秒 分 时 日 月 星期 年 在线生成cron表达式 http://cron.qqe2.com/

代码演示:

1.MyJob
java 复制代码
@Component
public class MyJob {
    @Scheduled(cron = "3/4 41 12 14 8 ? ")
    public void show(){
        System.out.println("甜甜开心"+ new Date());
    }
}

注意:在需要进行任务调度的方法上添加注解**@Scheduled(cron = "3/4 41 12 14 8 ? ")**

corn 里面的信息可以根据corn在线生成器获得

2.测试代码

java 复制代码
@SpringBootApplication
@EnableScheduling//开启任务调度
public class Springboot03CenterJobApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot03CenterJobApplication.class, args);
    }

}

注意:在测试代码中一定要开启任务调度,

开启任务调度的注解:@EnableScheduling

3.测试结果:

观察结果我们会发现每个4秒钟会被调度一次

四.SpringBoot 整合Mail


1. 第一步添加坐标
java 复制代码
<!--导入jedis的包-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>
2. 第二步开启配置
2.1 编写配置文件application.properties
java 复制代码
##配置邮箱信息
spring.mail.username=3418813089
spring.mail.password=dvhgkvhmqngtdaeh //QQ邮箱授权码
##发送邮件服务器
spring.mail.host=smtp.qq.com
#ssl\u8FDE\u63A5
spring.mail.properties.smtp.ssl.enable=true

此处我们以扣扣邮箱作为发送方的邮箱

2.2 QQ邮箱授权码的查看步骤
3. 第三步编写代码
java 复制代码
package com.ztt.springboot_04_center_mail;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import redis.clients.jedis.Jedis;

import javax.mail.internet.MimeMessage;
import java.io.File;

@SpringBootTest
class Springboot04CenterMailApplicationTests {

    @Autowired(required = false)
    private JavaMailSenderImpl javaMailSender;

    //发送简单邮件
    @Test
    void show1() {
        //1.创建邮件对象
        SimpleMailMessage simpleMailMessage =   new SimpleMailMessage();
        //2.设置信息
        simpleMailMessage.setSubject("甜甜不甜");
        simpleMailMessage.setText("啊啊啊啊啊学习使我快乐~~~");
        simpleMailMessage.setFrom("3418813089@qq.com");
        simpleMailMessage.setTo("1587154344@qq.com");
        //3.发送邮件
        javaMailSender.send(simpleMailMessage);
        System.out.println("发送成功~~~");
    }

    //发送复杂邮件
    @Test
    void show2()throws Exception {
        //1.创建邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //2.创建MimeMessageHelper
        MimeMessageHelper mimeMessageHelper =  new MimeMessageHelper(mimeMessage,true);
        //3.设置信息
        mimeMessageHelper.setSubject("程序员的误解");
        mimeMessageHelper.setText("程序员是个<span style='color:red'>高薪,高危</span>的职业",true);
        mimeMessageHelper.addAttachment("1.jpg",new File("E:\\壁紙\\1.jpg"));
        mimeMessageHelper.setFrom("3418813089@qq.com");
        mimeMessageHelper.setTo("1587154344@qq.com");
        //4.发送邮件
        javaMailSender.send(mimeMessage);
    }

    @Test
    public void show(){
        Jedis jedis=new Jedis("localhost" ,6379);
        System.out.println(jedis.ping());
    }

}
4.测试结果:
相关推荐
qq_12498707532 分钟前
基于协同过滤算法的在线教育资源推荐平台的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·spring boot·spring·毕业设计
gugugu.23 分钟前
Redis持久化机制详解(二):AOF持久化全解析
数据库·redis·缓存
一 乐1 小时前
智慧医药|基于springboot + vue智慧医药系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
悟空码字1 小时前
SpringBoot接口防抖大作战,拒绝“手抖”重复提交!
java·spring boot·后端
与遨游于天地1 小时前
Spring 的10个核心能力,对框架开发的启示
java·后端·spring
计算机毕设指导62 小时前
基于微信小程序的垃圾分类信息系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
陌路203 小时前
redis缓存雪崩,击穿,穿透
redis·缓存·mybatis
韩立学长3 小时前
【开题答辩实录分享】以《植物园信息管理系统》为例进行选题答辩实录分享
java·数据库·spring
我认不到你3 小时前
自定义注解实现 Redis Stream 消息监听
spring boot·redis
Knight_AL4 小时前
Spring Boot 的主要特性与传统 Spring 项目的区别
spring boot·后端·spring