定时任务

哈喽哈喽,在进行本节课重点之前,我们来解决一下上节课留下的小问题,就是对于编辑的记录会在表中再次添加,未在原有的基础上进行修改,我们先对此进行代码修改。
在UserServiceImpl.java中修改相应代码即可:

@Override
	public void create(User user) {
		if(user.getId()!=null && user.getId()!=0){
			//修改
			userDao.update(user);
		}else{
			//新增
			userDao.create(user);
		}	
	}

主要任务:定时器


应用场景:
(1)淘宝下单+未付款:淘宝需要将超过24小时未付款的订单“自动”关闭定时器可以每隔2小时查询此种情况所有订单,关闭;
(2)淘宝收货+不点“确认收货”:7天”自动“确认收货。不可能是人一个个去点,所以还是定时器;
(3)淘宝订单已完成+不评价:”自动“好评。

接下来我们开始配置定时器。

  • 1、添加task定时任务的约束——applicationContext.xml
    <bean>标签中添加如下:
xmlns:task="http://www.springframework.org/schema/task"

http://www.springframework.org/schema/task 
http://www.springframework.org/schema/task/spring-task-4.3.xsd"
  • 2、创建定时任务类com.lf.job.TaskJob.java

在这里插入图片描述

  • 3、开启定时任务配置——applicationContext.xml
	<!-- 配置扫描@Service @@Repository注解 -->
	<context:component-scan base-package="com.lf.service,com.lf.job"  />
	
	<!-- 放开定时任务配置 -->
	<task:annotation-driven />
  • 4、定时任务类,添加代码——TaskJob.java
package com.lf.job;

import java.util.Date;

import org.apache.tools.ant.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.lf.service.UserService;

/**
 * 定时任务类
 * @author Administrator
 *
 */
@Component
public class TaskJob {
	
	@Autowired
	UserService userService;
	
	@Scheduled(cron="0/1 * * * * ?")
	public void userGrade(){
		System.out.println("定时器执行时间:"+DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
		//userService.updateGrade();
	}
}

Notes:

“*”字符代表所有可能的值;

“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值 ;

“/”字符用来指定数值的增量 “L”;

字符仅被用于天(月)和天(星期)两个子表达式,例如:“6L”表示这个月的倒数第6天。

运行后在console显示如下图:
在这里插入图片描述

那么接下来我们写一个定时任务

  1. 使用场景:商城用户有级别,满足条件后第二天自动升级
    在这里插入图片描述
  2. user表添加字段:级别 grade、消费总金额 total、账户余额 account
    在这里插入图片描述
  3. 代码部分
    (1)向User.java添加3个字段:grade、total、account
	private Integer grade;//级别
	private Double total;//消费总金额
	private Double account;//账户余额

	public Integer getGrade() {
		return grade;
	}
	public void setGrade(Integer grade) {
		this.grade = grade;
	}
	public Double getTotal() {
		return total;
	}
	public void setTotal(Double total) {
		this.total = total;
	}
	public Double getAccount() {
		return account;
	}
	public void setAccount(Double account) {
		this.account = account;
	}

(2)定时任务逻辑——UserServiceImpl.java

	@Override
	public void updateGrade() {
		//会员等级列表
		List<Map<String, Object>> gradelist = new ArrayList<Map<String,Object>>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("grade", "1");
		map.put("total", "0");
		gradelist.add(map);
		
		map = new HashMap<String, Object>();
		map.put("grade", "2");
		map.put("total", "5000");
		gradelist.add(map);
		
		map = new HashMap<String, Object>();
		map.put("grade", "3");
		map.put("total", "20000");
		gradelist.add(map);
		
		//查询符合会员等级升级条件的用户列表List<User>
		List<User> users = userDao.findByTotal(gradelist);
		
		if(users!=null && users.size()>0){
			//更新这些用户级别+1
			userDao.updateGrade(users);
		}	
	}

(3)SQL语句——UserDao.xml
①在</mapper>之前写如下代码:

	<select id="findByTotal" parameterType="list" resultType="user">
		select * from user
		<where>
			<foreach item="item" index="index" collection="list" open=" ( "
				separator=" ) or ( " close=" ) ">
					grade = #{item.grade} - 1 and total &gt;= #{item.total}<!-- 大于和小于号要用转义符 -->
					<!-- 另一种xi<![CDATA[grade = #{item.grade} - 1 and total >= #{item.total}]]> -->
			</foreach>
		</where>	
	</select>

	<update id="updateGrade" parameterType="List"><!--List<User>类型  -->
		update user set grade = grade + 1 where id in
		<foreach item="item" index="index" collection="list" open=" ( "
				separator="," close=" ) ">
					#{item.id} 
			</foreach>
	</update>

Note:
关于在MyBatis中大于小于的注意事项:
在这里插入图片描述在这里插入图片描述
②在<mapper>之后

	<select id="findById" parameterType="integer" resultType="user">
		select * from user where id = #{id}
	</select>

(4)将TaskJob.java中注释的部分释放

4 . MySQL部分
我们为了试验将数据库中的内容更改如下:
在这里插入图片描述

  1. 运行结果
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值