全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

MyBatis-Plus 集成

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在保留 MyBatis 灵活性的基础上,提供了大量开箱即用的增强功能:内置通用 CRUD、条件构造器、代码生成器、分页插件等,可显著提升开发效率。

核心特性

特性说明
无侵入仅做增强,不影响原生 MyBatis 功能
通用 CRUD内置 BaseMapper,单表操作无需写 SQL
条件构造器LambdaQueryWrapper 链式构建查询条件
代码生成器一键生成 Entity、Mapper、Service、Controller
分页插件物理分页,支持多数据库方言
自动填充自动填充创建时间、更新时间等字段

依赖引入

XML
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

注意:引入 mybatis-plus-boot-starter 后无需再引入 mybatis-spring-boot-starter,两者冲突。

BaseMapper 通用 CRUD

Entity 定义

Java
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableLogic
    private Integer deleted;
}

Mapper 接口

Java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 后自动拥有以下方法:
    // insert(T entity)
    // deleteById(Serializable id)
    // updateById(T entity)
    // selectById(Serializable id)
    // selectList(Wrapper<T> wrapper)
    // ... 等 17 个基础 CRUD 方法
}

CRUD 操作示例

Java
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    // 插入
    public void insert(User user) {
        userMapper.insert(user);
    }

    // 根据 ID 查询
    public User getById(Long id) {
        return userMapper.selectById(id);
    }

    // 根据 ID 更新
    public void update(User user) {
        userMapper.updateById(user);
    }

    // 根据 ID 删除(逻辑删除)
    public void deleteById(Long id) {
        userMapper.deleteById(id);
    }

    // 批量查询
    public List<User> listByIds(List<Long> ids) {
        return userMapper.selectBatchIds(ids);
    }
}

条件构造器

LambdaQueryWrapper 链式查询

Java
// 查询 status=1 且 username 包含 "admin" 的用户,按创建时间倒序
List<User> users = userMapper.selectList(
    new LambdaQueryWrapper<User>()
        .eq(User::getStatus, 1)
        .like(User::getUsername, "admin")
        .orderByDesc(User::getCreateTime)
);

LambdaQueryWrapper 与 LambdaUpdateWrapper

Java
// 条件更新:将 status=0 的用户状态改为 1
userMapper.update(null,
    new LambdaUpdateWrapper<User>()
        .set(User::getStatus, 1)
        .eq(User::getStatus, 0)
);

// 条件删除
userMapper.delete(
    new LambdaQueryWrapper<User>()
        .lt(User::getCreateTime, LocalDateTime.now().minusDays(30))
);

复杂条件组合

Java
// (status=1 OR status=2) AND (username LIKE '%admin%' OR email LIKE '%admin%')
List<User> users = userMapper.selectList(
    new LambdaQueryWrapper<User>()
        .and(w -> w.eq(User::getStatus, 1).or().eq(User::getStatus, 2))
        .and(w -> w.like(User::getUsername, "admin").or().like(User::getEmail, "admin"))
);

IService 服务层封装

MP 提供了 IService 接口,进一步封装了 Service 层通用方法。

Java
public interface IUserService extends IService<User> {
    // 继承 IService 后自动拥有:
    // save(T entity), saveBatch(Collection<T> list)
    // removeById(Serializable id), updateById(T entity)
    // getById(Serializable id), list(Wrapper<T> queryWrapper)
    // page(IPage<T> page, Wrapper<T> queryWrapper)
    // ... 等更多批量与分页方法
}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements IUserService {
    // 通用方法已由 ServiceImpl 实现,可直接使用
}

批量操作

Java
@Autowired
private IUserService userService;

// 批量插入(默认每批 1000 条)
List<User> users = Arrays.asList(user1, user2, user3);
userService.saveBatch(users);

// 自定义批次大小
userService.saveBatch(users, 500);

// 批量更新
userService.updateBatchById(users);

自动填充配置

Java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

分页插件配置

Java
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInterceptor.setMaxLimit(500L); // 单页最大 500 条
        interceptor.addInnerInterceptor(paginationInterceptor);
        return interceptor;
    }
}

分页查询使用

Java
// 分页查询:第 1 页,每页 10 条
IPage<User> page = new Page<>(1, 10);
IPage<User> result = userMapper.selectPage(page,
    new LambdaQueryWrapper<User>()
        .eq(User::getStatus, 1)
        .orderByDesc(User::getCreateTime)
);

System.out.println("总记录数:" + result.getTotal());
System.out.println("当前页数据:" + result.getRecords());

代码生成器

XML
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.5</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version>
</dependency>
Java
public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create(
                "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai",
                "root", "123456")
            .globalConfig(builder -> builder
                .author("小智")
                .outputDir("src/main/java")
                .disableOpenDir())
            .packageConfig(builder -> builder
                .parent("com.example")
                .entity("entity")
                .mapper("mapper")
                .service("service")
                .serviceImpl("service.impl")
                .controller("controller"))
            .strategyConfig(builder -> builder
                .addInclude("user", "order", "product")
                .entityBuilder()
                .enableLombok()
                .enableTableFieldAnnotation()
                .logicDeleteColumnName("deleted")
                .mapperBuilder()
                .enableMapperAnnotation()
                .enableBaseResultMap())
            .templateEngine(new FreemarkerTemplateEngine())
            .execute();
    }
}

MyBatis 原生与 MP 对比

操作原生 MyBatisMyBatis-Plus
根据 ID 查询手写 SQL + Mapper XMLmapper.selectById(id)
条件查询动态 SQL + <if>new LambdaQueryWrapper<User>().eq(...)
分页查询手写分页插件或 PageHelpermapper.selectPage(page, wrapper)
批量插入ExecutorType.BATCH 或 foreachservice.saveBatch(list)
逻辑删除手写 UPDATE ... SET deleted=1@TableLogic 注解 + mapper.deleteById(id)
自动填充手动 set 或拦截器@TableField(fill=...) + MetaObjectHandler

注意事项

  1. 版本兼容:MP 3.5.x 要求 MyBatis 3.5+,Spring Boot 2.x/3.x 需选择对应 starter
  2. 冲突排查:勿同时引入 mybatis-spring-boot-startermybatis-plus-boot-starter
  3. 多表查询:MP 仅增强单表 CRUD,复杂多表查询仍需手写 XML 或使用 @Select 注解
  4. 性能考量:条件构造器生成 SQL 可能不够优,复杂场景建议手写 SQL
  5. 逻辑删除:需在配置中指定逻辑删除字段与默认值,否则不生效

要点总结

  • MyBatis-Plus 在保留原生 MyBatis 基础上,提供了 BaseMapper、IService 等增强接口
  • BaseMapper 内置 17 个基础 CRUD 方法,单表操作无需写 SQL
  • LambdaQueryWrapper 支持类型安全的链式条件构造,避免字符串硬编码
  • IService + ServiceImpl 进一步封装 Service 层,支持批量操作与分页
  • 代码生成器可一键生成 Entity、Mapper、Service、Controller 全套代码
  • MP 增强的是单表 CRUD,复杂多表查询仍需依赖原生 MyBatis 的 XML 映射

存放路径:D:\git2\jwdev\articles\MYBATIS\专家\生态工具与扩展\MyBatis-Plus 集成.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 软删除与逻辑删除
下一篇 → PageHelper 分页插件
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库