苍穹外卖项目日记(day04)

发布于:2025-07-10 ⋅ 阅读:(23) ⋅ 点赞:(0)

苍穹外卖|项目日记(day04)

前言: 今天主要是接口开发, 涉及的新东西不多, 需要注意的只有多表联查和修改的逻辑,
在这里插入图片描述

今日难点:

1.菜品的停起售状态设置

2.套餐的停起售状态设置

3.动态sql中的 useGeneratedKeys 与 keyProperty 两个参数

一. 菜品的停起售状态设置

​ 在菜品的停售中, 包含其菜品的套餐与需停售, 所以也就涉及到两张表的修改.

 /**
     * 菜品的停售与起售
     *
     * @param id
     * @param status
     */
    @Override
    @Transactional
    public void setStatus(Integer status, Long id) {
        Dish dish = Dish.builder()
                        .status(status)
                        .id(id)
                        .build();
        dishMapper.update(dish);

        if(status == StatusConstant.DISABLE){
            // 如果是停售, 与菜品相关的套餐也要停售
            List<Long> dishid = new ArrayList<>();
            dishid.add(id);
            // 根据关联表获取需upadated的套餐
            List<Long> setmealid = setmealDishMapper.getSetmealIdsByDishIds(dishid);
            if(setmealid != null && setmealid.size() > 0) {
                setmealid.forEach(setmealId -> {
                    // 根据id进行update
                    Setmeal setmeal = Setmeal.builder()
                            .id(setmealId)
                            .status(status)
                            .build();
                    setmealMapper.update(setmeal);
                });
            }
        }

    }

二. 套餐的停起售状态设置

 /**
     * 套餐起售、停售
     * @param status
     * @param id
     */
    @Override
    @Transactional
    public void startOrStop(Integer status, Long id) {
        //起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
        if(status == StatusConstant.ENABLE){
            //select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ?
            List<Dish> dishList = dishMapper.getBySetmealId(id);
            if(dishList != null && dishList.size() > 0){
                dishList.forEach(dish -> {
                    if(StatusConstant.DISABLE == dish.getStatus()){
                        throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                    }
                });
            }
        }

        Setmeal setmeal = Setmeal.builder()
                .id(id)
                .status(status)
                .build();
        setmealMapper.update(setmeal);

三. 动态sql的两个参数

一、参数含义

1. useGeneratedKeys="true"

  • 作用:启用数据库自动生成的主键获取功能
  • 默认值false(不自动获取生成的主键)
  • 适用数据库:支持自动生成主键的数据库(如 MySQL 的 AUTO_INCREMENT,Oracle 的序列等)

2. keyProperty="id"

  • 作用:指定将获取到的主键值设置到哪个 Java 对象属性中
  • 值格式:对应 Java 对象的属性名,支持嵌套属性(如 user.id

二.示例

1. 单条记录插入后获取主键

典型场景:插入一条新记录后,需要立即使用该记录的主键进行后续操作

// mapper.xml
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO users(username, email) VALUES(#{username}, #{email})
</insert>

java代码示例:

// service层
User user = new User();
user.setUsername("张三");
user.setEmail("zhangsan@example.com");
userMapper.insertUser(user);
// 插入后,user.getId() 会自动被赋值为数据库生成的主键值
System.out.println("新用户ID:" + user.getId());
2.修改记录后获取主键

典型场景: 修改一条记录, 需要立即使用该记录的主键进行后续操作

// mapper.xml
<update id="update" useGeneratedKeys="true" keyProperty="id">
        update setmeal
        <set>
            <if test="categoryId != null">
                category_id = #{categoryId},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="price != null">
                price = #{price},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="description != null">
                description = #{description},
            </if>
            <if test="image != null">
                image = #{image},
            </if>
        </set>
        where id = #{id}
    </update>

网站公告

今日签到

点亮在社区的每一天
去签到