MyBatis-Plus

基础概念

MyBatis-Plus 使用教程、特性与介绍

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具库,在保留 MyBatis 原生功能的基础上,提供了更简洁高效的 CRUD 操作、代码生成、条件构造器等特性,大幅减少 SQL 编写量。以下是核心内容:

一、核心特性
  1. 无侵入设计
    仅扩展 MyBatis 功能,不改变原生结构,兼容所有 MyBatis 配置。

  2. 强大的 CRUD 封装

    • 通过继承 BaseMapper<T> 接口,自动实现单表增删改查,无需手动写 SQL。
      public interface UserMapper extends BaseMapper<User> { }  // 自动获得 17 个基础方法
      
    • 内置通用 Service 层封装(IService + ServiceImpl):
      public interface UserService extends IService<User> { }
      @Service
      public class UserServiceImpl extends ServiceImpl<UserMapper, User> 
                                  implements UserService { }
      
  3. 智能条件构造器
    使用 QueryWrapperLambdaQueryWrapper 动态构建 SQL 条件:

    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("name", "Tom").lt("age", 30);  // WHERE name LIKE '%Tom%' AND age < 30
    List<User> users = userMapper.selectList(wrapper);
    
  4. 主键策略支持
    支持自增、UUID、雪花算法等分布式 ID 生成(通过 @TableId 注解配置)。

  5. 插件扩展

    • 分页插件:无需手动处理分页逻辑。
    • 性能分析插件:输出 SQL 执行时间,优化慢查询。
    • 乐观锁插件:通过 @Version 注解实现并发控制。
二、快速使用教程(Spring Boot)
  1. 添加依赖

    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.0</version>
    </dependency>
    
  2. 配置数据源与 MP(application.yml)

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/db
        username: root
        password: 123456
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志
    
  3. 实体类注解

    @Data
    @TableName("sys_user")  // 指定表名
    public class User {
      @TableId(type = IdType.AUTO) // 自增主键
      private Long id;
      private String name;
      private Integer age;
      @TableField("user_email") // 映射字段名
      private String email;
    }
    
  4. 基础 CRUD 示例

    // 插入
    User user = new User();
    user.setName("John");
    userMapper.insert(user); // SQL自动生成
    
    // 批量插入(Service层)
    List<User> userList = ...;
    userService.saveBatch(userList); 
    
    // 查询记录数
    long count = userService.count(); 
    
    // 条件查询
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getName, "John");
    List<User> users = userService.list(wrapper);
    
三、进阶功能
  1. 代码生成器
    自动生成 Entity、Mapper、Service、Controller 代码:

    AutoGenerator generator = new AutoGenerator();
    generator.setGlobalConfig(...); // 配置包路径、作者等
    generator.setDataSource(...);  // 数据库配置
    generator.setStrategy(...);    // 生成策略
    generator.execute(); // 执行生成
    
  2. 逻辑删除
    添加注解实现软删除:

    @TableField("is_deleted")
    @TableLogic // 逻辑删除字段
    private Integer deleted;
    

    执行 deleteById(id) 实际触发 UPDATE 操作。

  3. 字段自动填充
    配合 @TableField(fill = FieldFill.INSERT) 自动填充创建时间/更新时间。

四、适用场景
  1. 快速开发后台管理系统(如权限管理、数据报表)。
  2. 需要减少重复 SQL 编写的单表操作场景。
  3. 微服务架构中基础数据模块开发。
  4. 需要动态条件查询但不想用 JPA 的项目。

提示:复杂多表关联查询仍建议使用 MyBatis 原生 XML 编写 SQL。

思维导图

在这里插入图片描述


进阶内容

MyBatis-Plus 核心功能详解

一、多表联合查询实现方法

MyBatis-Plus 主要专注于单表操作,多表查询需结合原生 MyBatis 实现:

  1. XML 映射文件实现
<select id="selectUserWithOrders" resultMap="userOrderMap">
  SELECT u.*, o.order_id, o.order_amount 
  FROM user u 
  LEFT JOIN orders o ON u.id = o.user_id
  WHERE u.id = #{userId}
</select>
  1. 注解方式实现
@Select("SELECT u.name, o.order_no FROM user u INNER JOIN orders o ON u.id = o.user_id")
@Results({
  @Result(property = "name", column = "name"),
  @Result(property = "orders", column = "order_no")
})
List<UserOrderDTO> selectUserOrders();

注意:对比 MyBatis-Flex/Fluent-MyBatis 的联表支持(引用[1]),MP 在多表查询方面较弱,复杂场景建议结合原生 MyBatis


二、分页功能配置与使用
  1. 配置分页插件
@Configuration
public class MybatisPlusConfig {
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
  }
}
  1. 分页查询实践
// 构造分页参数(当前页, 每页数量)
Page<User> page = new Page<>(1, 10); 

// 单表分页
Page<User> userPage = userMapper.selectPage(page, null);

// 自定义SQL分页
Page<UserOrderDTO> resultPage = userMapper.selectUserOrders(page, params);
List<UserOrderDTO> records = resultPage.getRecords(); // 当前页数据
long total = resultPage.getTotal(); // 总记录数

分页总量缓存设计可优化性能(引用[1])


三、数据库字段加密存储

通过 @TableField 注解和自定义 TypeHandler 实现:

  1. 实体类配置
public class User {
  @TableField(typeHandler = AESEncryptHandler.class)
  private String mobile; // 手机号加密存储
}
  1. 自定义加密处理器
public class AESEncryptHandler extends BaseTypeHandler<String> {
  @Override
  public void setNonNullParameter(...) {
    // 加密逻辑
    String encrypted = AESUtil.encrypt(parameter);
    ps.setString(i, encrypted);
  }
  
  @Override
  public String getNullableResult(ResultSet rs, String columnName) {
    // 解密逻辑
    return AESUtil.decrypt(rs.getString(columnName));
  }
}

支持在数据存储层自动加解密(引用[3])


四、乐观锁机制

通过 @Version 注解实现并发控制:

  1. 实体类配置
public class Product {
  @Version
  private Integer version; // 乐观锁字段
}
  1. 更新操作流程
-- 更新时自动附加版本条件
UPDATE product SET stock=10, version=version+1 
WHERE id=100 AND version=2
  1. 更新冲突处理
Product product = productMapper.selectById(100);
product.setStock(product.getStock() - 1);

int attempts = 0;
while (attempts++ < 3) {
  try {
    productMapper.updateById(product);
    break; // 更新成功
  } catch (OptimisticLockingFailureException ex) {
    // 重试:重新查询最新数据
    product = productMapper.selectById(100);
  }
}

五、MyBatis-Plus 与 MyBatis 核心区别
特性MyBatisMyBatis-Plus
CRUD 操作需手动编写SQL自动生成基础SQL(BaseMapper
条件构造器QueryWrapper/LambdaQueryWrapper
分页支持需手动实现内置分页插件
代码生成需第三方工具内置代码生成器
性能分析需手动配置内置性能分析插件
多表联查完整支持需结合原生MyBatis实现
依赖复杂度轻量依赖更多(如注解处理)
学习曲线较陡峭更平缓(开箱即用)

核心定位:MP 是 MyBatis 的增强工具而非替代品,解决重复 CRUD 编码问题(引用[2])

思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值