文章目录
- 缓存菜品
- 实现思路
- 代码开发
- 缓存套餐
- Spring Cache
- 入门案例
- 实现思路
- 代码开发
- 添加购物车
- 需求分析和设计
- 代码开发
- 查看购物车
- 需求分析
- 代码开发
- 清空购物车
- 需求分析
- 代码实现
缓存菜品
实现思路
代码开发
Controller层
@RestController("userDishController")
@Api(tags = "C端-菜品浏览接口")
@RequestMapping("/user/dish")
@Slf4j
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisTemplate redisTemplate;/*** 根据分类id查询菜品* @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询菜品")private Result<List<DishVO>> list(Long categoryId){//构造redis中的key,规则:dish_分类idString key = "dish_"+categoryId;//查询redis中是否存在菜品数据List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);if (list!=null && list.size() > 0){//如果存在直接返回无需查询数据库return Result.success(list);}Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品//如果不存在,查询数据库,将查询数据库插入到redis中List<DishVO> dishVOS = dishService.listWithFlavor(dish);redisTemplate.opsForValue().set(key, dishVOS);return Result.success(dishVOS);}
}
在新增菜品,修改菜品,批量删除菜品,起售、停售菜品时候都需要清除缓存以便显示最新数据。
可以在每个Controller方法完成后加上
Set keys = redisTemplate.keys("dish_*");redisTemplate.delete(keys);
可以设计一个清理缓存的方法来替代
/*** 清理缓存数据* @param pattern*/private void cleanCache(String pattern){Set keys = redisTemplate.keys(pattern);redisTemplate.delete(keys);}
缓存套餐
Spring Cache
入门案例
根据demo文件创建数据库和对应的表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
);
Controller层
@Autowiredprivate UserMapper userMapper;//user.id 动态取到用户id,redis通过冒号储存成树形结构@PostMapping@CachePut(cacheNames = "userCache",key = "#user.id") //将方法的返回值放入缓存,key的生成为:userCache::user.id//@CachePut(cacheNames = "userCache",key = "#result.id") //对象导航//@CachePut(cacheNames = "userCache",key = "#p0.id")//取到第一个参数//@CachePut(cacheNames = "userCache",key = "#a0.id")public User save(@RequestBody User user){userMapper.insert(user);return user;}
实现类加注解
@Slf4j
@SpringBootApplication
@EnableCaching//开去缓存注解功能
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");}
}
通过Swagger接口测试。
其他的常用注解
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserMapper userMapper;//user.id 动态取到用户id,redis通过冒号储存成树形结构@PostMapping@CachePut(cacheNames = "userCache",key = "#user.id") //将方法的返回值放入缓存,key的生成为:userCache::user.id//@CachePut(cacheNames = "userCache",key = "#result.id") //对象导航//@CachePut(cacheNames = "userCache",key = "#p0.id")//取到第一个参数//@CachePut(cacheNames = "userCache",key = "#a0.id")public User save(@RequestBody User user){userMapper.insert(user);return user;}@CacheEvict(cacheNames = "userCache", key = "#id")@DeleteMappingpublic void deleteById(Long id){userMapper.deleteById(id);}@CacheEvict(cacheNames = "userCache" ,allEntries = true)//删除所有键值对缓存@DeleteMapping("/delAll")public void deleteAll(){userMapper.deleteAll();}@Cacheable(cacheNames = "userCache",key = "#id")//key的生成为:userCache::id@GetMappingpublic User getById(Long id){User user = userMapper.getById(id);return user;}
实现思路
代码开发
@GetMapping("/list")@ApiOperation("根据分类id查询套餐")@Cacheable(cacheNames = "setmealCache",key = "#categoryId") //key:setmaelCache::categoryIdpublic Result<List<Setmeal>> list(Long categoryId){List<Setmeal> setmeals = setmealService.list(categoryId);return Result.success(setmeals);}
/*** 新增套餐接口* @param setmealDTO* @return*/@PostMapping@ApiOperation("新增套餐")@CacheEvict(cacheNames = "setmealCache" ,key = "#setmealDTO.categoryId")//key:setmealCache::100public Result save(@RequestBody SetmealDTO setmealDTO){setmealService.save(setmealDTO);return Result.success();}/*** 批量删除套餐* @param ids* @return*/@DeleteMapping@ApiOperation("批量删除套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)public Result delete(@RequestParam List<Long> ids){setmealService.deleteBatch(ids);return Result.success();}/*** 修改套餐* @param setmealDTO* @return*/@PutMapping@ApiOperation("修改套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)public Result update(@RequestBody SetmealDTO setmealDTO){setmealService.update(setmealDTO);return Result.success();}
添加购物车
需求分析和设计
冗余字段在特定条件下可以提高查询速度,比如这里的name,image,amount等。因为这样不用联表查询只用查这一张表就好了。
代码开发
新建Controller层
@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "C端-购物车相关接口")
public class ShoppingCartController {@Autowiredprivate ShoppingCartService shoppingCartService;/*** 添加购物车* @param shoppingCartDTO* @return*/@PostMapping("/add")@ApiOperation("添加购物车")public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO){shoppingCartService.addShoppingCart(shoppingCartDTO);return Result.success();}
}
ServiceImpl
@Slf4j
@Service
public class ShopppingCartServiceImpl implements ShoppingCartService {@Autowiredprivate ShopppingCartMapper shopppingCartMapper;@Autowiredprivate DishMapper dishMapper;@Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车* @param shoppingCartDTO*/@Overridepublic void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {//判断当前加入购物车的商品已经存在了ShoppingCart shoppingCart =new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);Long userId = BaseContext.getCurrentId();shoppingCart.setUserId(userId);List<ShoppingCart> list = shopppingCartMapper.list(shoppingCart);//如果已经存在了,只需要将数量加一if (list != null && list.size() > 0){ShoppingCart shoppingCart1 = list.get(0);shoppingCart1.setNumber(shoppingCart1.getNumber()+ 1 );//update shopping_cart set number = ? where id = ?shopppingCartMapper.updateNumberById(shoppingCart1);}else{//如果不存在,需要插入一条购物车数据//判断本次添加到购物车的是菜品还是套餐Long dishId = shoppingCartDTO.getDishId();Long setmealId = shoppingCartDTO.getSetmealId();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(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());}shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());//统一插入shopppingCartMapper.insert(shoppingCart);}}
}
Mapper接口
@Mapper
public interface ShopppingCartMapper {/*** 动态条件查询* @param shoppingCart* @return*/List<ShoppingCart> list(ShoppingCart shoppingCart);/*** 根据id修改商品数量* @param shoppingCart*/@Update("update shopping_cart set number = #{number} where id = #{id}")void updateNumberById(ShoppingCart shoppingCart);/*** 插入购物车数据* @param shoppingCart*/@Insert("insert into shopping_cart (name, image, user_id, dish_id, setmeal_id, dish_flavor, amount, number, create_time) VALUES " +"(#{name} ,#{image} ,#{userId} ,#{dishId} ,#{setmealId} ,#{dishFlavor} ,#{amount} ,#{number} ,#{createTime} )")void insert(ShoppingCart shoppingCart);
}
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sky.mapper.ShopppingCartMapper"><select id="list" resultType="com.sky.entity.ShoppingCart">select * from shopping_cart<where><if test="userId != null">and user_id = #{userId}</if><if test="setmealId != null">and setmeal_id = #{setmealId}</if><if test="dishId != null">and dish_id = #{dishId}</if><if test="dishFlavor != null">and dish_flavor = #{dishFlavor}</if></where></select>
</mapper>
查看购物车
需求分析
代码开发
Controller层
/*** 查看购物车* @return*/@GetMapping("/list")@ApiOperation("查看购物车")public Result<List<ShoppingCart>> list(){List<ShoppingCart> shoppingCarts = shoppingCartService.showShopppingCart();return Result.success(shoppingCarts);}
Service实现类
/*** 查看购物车* @return*/@Overridepublic List<ShoppingCart> showShopppingCart() {Long userId = BaseContext.getCurrentId();ShoppingCart shoppingCart = ShoppingCart.builder().userId(userId).build();List<ShoppingCart> list = shopppingCartMapper.list(shoppingCart);return list;}
清空购物车
需求分析
代码实现
Controller层
/*** 清空购物车* @return*/@DeleteMapping("/clean")@ApiOperation("清空购物车")public Result clean(){shoppingCartService.cleanShoppingCart();return Result.success();}
Service实现类
/*** 清空购物车*/@Overridepublic void cleanShoppingCart() {Long userId = BaseContext.getCurrentId();shopppingCartMapper.deleteByUserId(userId);}
Mapper接口
/*** 清空购物车* @param userId*/@Delete("delete from shopping_cart where user_id = #{userId}")void deleteByUserId(Long userId);