Mybatis实践——Wrapper&&三表联查&&BaseMapper和Service的功能分异

一、电商场景模型设计(Lombok)

java 复制代码
// 商品表
@Data
@TableName("product")
public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    private Integer stock;
}

// 用户表
@Data
@TableName("user")
public class User {
    private Long id;
    private String username;
    private String phone;
}

// 订单表(核心业务表)
@Data
@TableName("order")
public class Order {
    private Long id;
    private Long userId;
    private Long productId;
    private Integer quantity;
    private Integer status; // 0-待支付 1-已支付
    private LocalDateTime createTime;
}

二、Wrapper条件构造器详解

1. 常用Wrapper类型

  • QueryWrapper:普通条件构造
  • LambdaQueryWrapper:Lambda表达式写法
  • UpdateWrapper:更新条件构造

2. 复杂查询示例

java 复制代码
// 查询已支付且数量大于2的订单
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>()
    .eq(Order::getStatus, 1)
    .gt(Order::getQuantity, 2)
    .between(Order::getCreateTime, startTime, endTime)
    .orderByDesc(Order::getCreateTime);

List<Order> orders = orderMapper.selectList(wrapper);

三、三表联查实现方案

业务场景:查询订单详情(包含用户和商品信息)

1. 自定义DTO

java 复制代码
@Data
public class OrderDetailDTO {
    private String orderNo;
    private String username;
    private String productName;
    private BigDecimal totalAmount;
    private LocalDateTime createTime;
}

2. BaseMapper实现

OrderMapper.java

java 复制代码
public interface OrderMapper extends BaseMapper<Order> {
    @Select("SELECT o.order_no, u.username, p.name as product_name, " +
            "o.quantity*p.price as total_amount, o.create_time " +
            "FROM order o " +
            "LEFT JOIN user u ON o.user_id = u.id " +
            "LEFT JOIN product p ON o.product_id = p.id " +
            "WHERE o.id = #{orderId}")
    OrderDetailDTO selectOrderDetail(@Param("orderId") Long orderId);
}

3. IService实现

OrderService.java

java 复制代码
public interface OrderService extends IService<Order> {
    OrderDetailDTO getOrderDetail(Long orderId);
}

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
    @Override
    public OrderDetailDTO getOrderDetail(Long orderId) {
        return baseMapper.selectOrderDetail(orderId);
    }
}

四、BaseMapper vs IService对比

特性 BaseMapper IService
接口层级 Mapper层基础接口 Service层扩展接口
方法类型 基础CRUD操作 批量操作+逻辑删除扩展
实现方式 XML/注解 默认实现ServiceImpl
事务控制 需手动声明 自带事务方法
典型方法 selectById saveBatch
适用场景 简单单表操作 复杂业务逻辑处理

五、自定义Mapper方法实践

统计各状态订单数量

java 复制代码
// OrderMapper接口新增
@Select("SELECT status, COUNT(*) as count FROM order GROUP BY status")
List<Map<String, Object>> countByStatus();

// 使用示例
List<Map<String, Object>> stats = orderMapper.countByStatus();

六、开发建议

  1. Wrapper使用原则

    • 简单条件使用Lambda表达式保证类型安全
    • 复杂查询优先考虑自定义SQL
    • 避免在Wrapper中硬编码字段名
  2. 联查优化建议

    • 超过3表关联建议使用视图或冗余字段
    • 注意N+1查询问题
    • 大数据量查询使用分页插件
  3. 框架选择策略

    • 简单CRUD直接使用BaseMapper
    • 批量操作优先使用IService
    • 复杂逻辑结合MyBatis原生功能实现
相关推荐
多敲代码防脱发4 小时前
Spring框架基本使用(Maven详解)
java·网络·后端·spring·maven
B站计算机毕业设计超人5 小时前
计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
java·vue.js·spring boot·后端·spring·intellij-idea·课程设计
why技术5 小时前
可以说是一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
后端·面试
m0_748254665 小时前
定时任务特辑 Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比,和Spring Boot集成实战
java·spring boot·后端
diemeng11196 小时前
2024系统编程语言风云变幻:Rust持续领跑,Zig与Ada异军突起
开发语言·前端·后端·rust
Warren986 小时前
Springboot中分析SQL性能的两种方式
java·spring boot·后端·sql·mysql·intellij-idea
canonical_entropy6 小时前
Nop平台与橙单OrangeForm集成
后端·低代码
计算机学姐7 小时前
基于SpringBoot的校园消费点评管理系统
java·vue.js·spring boot·后端·mysql·spring·java-ee
猎人everest7 小时前
Spring Boot数据访问(JDBC)全解析:从基础配置到高级调优
java·spring boot·后端