企业标准 DTO 传参 + Controller + Service + 拷贝工具类完整版


1)先写两个 DTO(新增、修改)

ShopSaveDTO.java(新增用)

复制代码
import lombok.Data;
import java.math.BigDecimal;

@Data
public class ShopSaveDTO {
    private String name;
    private String address;
    private Long typeId;
    private String phone;
    private BigDecimal avgPrice;
}

ShopUpdateDTO.java(修改用)

复制代码
import lombok.Data;
import java.math.BigDecimal;

@Data
public class ShopUpdateDTO {
    private Long id;          // 修改必须传id
    private String name;
    private String address;
    private Long typeId;
    private String phone;
    private BigDecimal avgPrice;
}

2)Controller(完整,接收 DTO)

复制代码
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;

@RestController
@RequestMapping("/shop")
public class ShopController {

    @Resource
    private ShopService shopService;

    // 查询
    @GetMapping("/{id}")
    public Result queryById(@PathVariable Long id) {
        return shopService.queryById(id);
    }

    // 新增(接收 ShopSaveDTO)
    @PostMapping
    public Result saveShop(@RequestBody ShopSaveDTO dto) {
        return shopService.saveShop(dto);
    }

    // 修改(接收 ShopUpdateDTO)
    @PutMapping
    public Result updateShop(@RequestBody ShopUpdateDTO dto) {
        return shopService.updateShop(dto);
    }

    // 删除
    @DeleteMapping("/{id}")
    public Result deleteShop(@PathVariable Long id) {
        return shopService.deleteShop(id);
    }
}

3)Service 接口

复制代码
import com.baomidou.mybatisplus.extension.service.IService;

public interface ShopService extends IService<Shop> {
    Result queryById(Long id);
    Result saveShop(ShopSaveDTO dto);
    Result updateShop(ShopUpdateDTO dto);
    Result deleteShop(Long id);
}

4)ServiceImpl(完整 + BeanUtils.copyProperties)

复制代码
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.redis.core.StringRedisTemplate;

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements ShopService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private CacheClient cacheClient;

    private static final String CACHE_SHOP_KEY = "cache:shop:";

    // ====================== 查询(你原来的逻辑)======================
    @Override
    public Result queryById(Long id) {
        Shop shop = cacheClient.queryWithPassThrough(
                CACHE_SHOP_KEY,
                id,
                Shop.class,
                this::getById,
                30L,
                java.util.concurrent.TimeUnit.MINUTES
        );

        if (shop == null) {
            return Result.fail("店铺不存在");
        }
        return Result.ok(shop);
    }

    // ====================== 新增 ======================
    @Override
    @Transactional
    public Result saveShop(ShopSaveDTO dto) {
        Shop shop = new Shop();
        BeanUtils.copyProperties(dto, shop); // DTO → 实体
        save(shop);
        return Result.ok();
    }

    // ====================== 修改 ======================
    @Override
    @Transactional
    public Result updateShop(ShopUpdateDTO dto) {
        Shop shop = new Shop();
        BeanUtils.copyProperties(dto, shop); // DTO → 实体
        updateById(shop);

        // 删除缓存
        stringRedisTemplate.delete(CACHE_SHOP_KEY + dto.getId());

        return Result.ok();
    }

    // ====================== 删除 ======================
    @Override
    @Transactional
    public Result deleteShop(Long id) {
        removeById(id);
        stringRedisTemplate.delete(CACHE_SHOP_KEY + id);
        return Result.ok();
    }
}
相关推荐
噢,我明白了21 分钟前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff1 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶1 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
时间的拾荒人1 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
敲上瘾2 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
Java码农也是农2 小时前
Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选
java·spring boot·spring·事务
合尘猫2 小时前
图片表格变结构化数据:OCR 后的三个坑
python·ocr
小小张说故事2 小时前
Python 里弱引用到底弱在哪:拆开 weakref.ref、回调陷阱和 WeakValueDictionary
python
学长毕设2 小时前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端