哈喽哈喽,在进行本节课重点之前,我们来解决一下上节课留下的小问题,就是对于编辑的记录会在表中再次添加,未在原有的基础上进行修改,我们先对此进行代码修改。
在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显示如下图:
那么接下来我们写一个定时任务
- 使用场景:商城用户有级别,满足条件后第二天自动升级
- user表添加字段:级别 grade、消费总金额 total、账户余额 account
- 代码部分
(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 >= #{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部分
我们为了试验将数据库中的内容更改如下:
- 运行结果