今日完结任务:
完成了缓存菜品、缓存套餐的功能接口开发
完成了添加购物车的功能接口开发
今日收获:
1.学习了SpringCache
在管理员端是,如果对菜品或者套餐进行新增、删除、修改和启用禁用时,要及时的清理缓存,要不然会造成数据的不一致情况。简单来说就是,当我们数据库对数据进行增删改时,数据库里的数据改变了,如果没有清理缓存。那么下次我们的用户端查询数据时,可能会先查询到缓存中的错误数据。
而SpringCache 实现了基于注解的缓存功能,它提供了一层抽象,底层能实现不同的缓存功能。
2.删除不用检测到通配符
3修改是要考虑到修改分类会影响多分缓存数据
4.抽取成一个清理缓存的方法
5.缓存套餐(spring cache)
6.springcache,实现了基于注解的缓存功能,提供了一层抽象,底层能实现不同的缓存实现
@Cacheable
先去查缓存中有没有数据,若有则直接返回,不会执行下面的方法。没有则继续执行,再数据库中查找,并加入到缓存中。
/**
* 条件查询(在缓存中查询)
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@Cacheable(cacheNames = "setmealCache",key = "#categoryId")
public Result<List<Setmeal>> list(Long categoryId) {
Setmeal setmeal = new Setmeal();
setmeal.setCategoryId(categoryId);
setmeal.setStatus(StatusConstant.ENABLE);
List<Setmeal> list = setmealService.list(setmeal);
return Result.success(list);
}
其中cacheNames 为缓存的名称,key为Redis中的键
@CachePut
@CacheEvict
@DeleteMapping
@CacheEvict(cacheNames = "setmealCache",allEntries = true)
public Result delete (@RequestParam List<Long> ids) {
log.info("根据id批量删除套餐:{}",ids);
setmealService.deleteBatch(ids);
return Result.success();
}
通过代理对象来完成的,通过springcasch框架为conteoller创建代理对象,通过代理对象计算出key,然后操作redis删除数据allEntries = ture: 删除缓存名为setmealCache的所有键值对
2.学习了购物车功能:暂时存放菜品和套餐
添加购物车Controller层
@PostMapping("/add")
/**
* 添加购物车
*/
public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {
log.info("添加购物查");
shoppingCarService.addShoppingCar(shoppingCartDTO);
return Result.success();
}
添加购物车Service层
/**
* 添加购物车
* @param shoppingCartDTO
*/
void addShoppingCar(ShoppingCartDTO shoppingCartDTO);
添加购物车的实现类层:
/**
* 添加购物车
* @param shoppingCartDTO
*/
@Override
public void addShoppingCar(ShoppingCartDTO shoppingCartDTO) {
//判断当前商品是否在购物车
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
Long userId = BaseContext.getCurrentId();
shoppingCart.setUserId(userId);
List<ShoppingCart> shoppingCartList = shoppingCarMapper.list(shoppingCart);
//若在购物车,则执行更新操作,数量+1
//因为userid,所以list里要么没有数据要么只有一个数据
if(shoppingCartList != null && shoppingCartList.size() == 1) {
shoppingCart = shoppingCartList.get(0);
Integer number = shoppingCart.getNumber() + 1;
shoppingCart.setNumber(number);
shoppingCarMapper.update(shoppingCart);
} else {
//不在购物车,则执行插入操作
//判断本次添加是菜品还是套餐
Long dishId = shoppingCartDTO.getDishId();
if (dishId != null) {
//本次添加的是菜品
//获取到菜品的相关信息
Dish dish = dishMapper.getById(dishId);
shoppingCart.setName(dish.getName());
shoppingCart.setImage(dish.getImage());
shoppingCart.setAmount(dish.getPrice());
} else {
//本次添加的是套餐
Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId());
shoppingCart.setName(setmeal.getName());
shoppingCart.setImage(setmeal.getImage());
shoppingCart.setAmount(setmeal.getPrice());
}
shoppingCart.setNumber(1);
shoppingCart.setCreateTime(LocalDateTime.now());
shoppingCarMapper.insert(shoppingCart);
}
}
Mapper层
创建ShoppingCartMapper接口:
package com.sky.mapper;
import com.sky.entity.ShoppingCart;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@Mapper
public interface ShoppingCartMapper {
/**
* 条件查询
*
* @param shoppingCart
* @return
*/
List<ShoppingCart> list(ShoppingCart shoppingCart);
/**
* 更新商品数量
*
* @param shoppingCart
*/
@Update("update shopping_cart set number = #{number} where id = #{id}")
void updateNumberById(ShoppingCart shoppingCart);
/**
* 插入购物车数据
*
* @param shoppingCart
*/
@Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) " +
" values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})")
void insert(ShoppingCart shoppingCart);
}
创建ShoppingCartMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.ShoppingCartMapper">
<select id="list" parameterType="ShoppingCart" resultType="ShoppingCart">
select * from shopping_cart
<where>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="dishId != null">
and dish_id = #{dishId}
</if>
<if test="setmealId != null">
and setmeal_id = #{setmealId}
</if>
<if test="dishFlavor != null">
and dish_flavor = #{dishFlavor}
</if>
</where>
order by create_time desc
</select>
</mapper>
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!