ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MyBatis-Plus条件构造器与核心接口实战指南

MyBatis-Plus条件构造器与核心接口实战指南 1. MyBatis-Plus条件构造器深度解析MyBatis-Plus作为MyBatis的增强工具包其条件构造器Wrapper是日常开发中最常用的核心组件之一。我在实际项目中使用MP的条件构造器处理过各种复杂查询场景相比传统XML方式它能让代码更简洁、类型更安全。下面从底层设计到实战技巧全面剖析这个利器。1.1 条件构造器体系结构MP的条件构造器主要分为两类AbstractWrapper基础抽象类包含所有条件构造方法QueryWrapper查询条件封装UpdateWrapper更新条件封装LambdaQueryWrapperLambda语法封装LambdaUpdateWrapperLambda更新封装// 典型使用示例 QueryWrapperUser wrapper new QueryWrapper(); wrapper.select(id, name) .eq(status, 1) .between(age, 20, 30) .orderByDesc(create_time);经验在Spring环境中建议通过Wrappers.Tquery()静态方法创建可避免泛型类型重复声明1.2 核心方法实战指南1.2.1 比较条件eq/ne等于/不等于gt/ge/lt/le大于/大于等于/小于/小于等于between/notBetween区间查询// 复杂条件组合示例 wrapper.gt(score, 90) .lt(score, 100) .or(w - w.eq(vip_level, 3))1.2.2 模糊查询like/notLike%value%likeLeft/likeRight%value/value%in/notIn集合查询避坑模糊查询字段需在数据库建立合适索引否则大数据量时性能极差1.2.3 排序与分组orderBy/orderByAsc/orderByDescgroupBy/having// 多字段排序示例 wrapper.orderByAsc(department) .orderByDesc(hire_date)2. MyBatis-Plus常用接口详解2.1 BaseMapper核心方法MP为每个实体提供的默认Mapper接口包含这些关键方法方法名参数返回值说明selectByIdSerializableT按主键查询selectBatchIdsCollection?List批量ID查询selectByMapMapString,ObjectList字段映射查询insertTint插入记录updateByIdTint按ID更新deleteByIdSerializableint按ID删除// 典型CRUD操作示例 User user userMapper.selectById(1L); user.setName(updated); userMapper.updateById(user);2.2 IService扩展接口比BaseMapper更强大的服务层接口主要增强功能批量操作saveBatch/updateBatchById链式查询lambdaQuery/lambdaUpdate逻辑删除removeById/Logic// 批量操作示例实测10万条数据比单条循环快15倍以上 ListUser userList ... // 大数据集 userService.saveBatch(userList, 1000); // 每批1000条2.3 分页插件配置Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }注意分页查询必须先配置拦截器否则分页参数不生效3. 高级应用与性能优化3.1 动态表名处理通过动态表名处理器实现分表查询public class DynamicTableNameHandler implements TableNameHandler { Override public String dynamicTableName(String sql, String tableName) { return tableName _ LocalDate.now().getYear(); } } // 配置拦截器 interceptor.addInnerInterceptor(new DynamicTableNameInnerInterceptor(new DynamicTableNameHandler()));3.2 性能优化实践索引命中检查通过explain分析生成的SQL是否走索引批处理优化合理设置batchSize建议500-2000N1问题解决使用TableField(exist false)手动查询替代关联查询SQL打印控制生产环境关闭mybatis-plus.configuration.log-impl// 性能监控示例 wrapper.select(id, name) // 只查必要字段 .eq(dept_id, 10) // 确保dept_id有索引 .last(limit 100); // 大数据量限制条数4. 常见问题排查手册4.1 典型报错解决方案问题现象原因分析解决方案PaginationInterceptor类找不到MP版本差异3.4.0改为PaginationInnerInterceptor分页total始终为0未配置count查询使用selectPage自动countLambda字段报错实体字段名变更清理target重新编译逻辑删除失效未加TableLogic实体字段添加注解4.2 复杂SQL实现方案当Wrapper无法满足时可采用以下方案Select注解简单SQL直接写在Mapper接口XML映射文件复杂多表关联查询自定义SQLWrapperSelect(${ew.customSqlSegment})Select(select u.* from user u ${ew.customSqlSegment}) ListUser selectByWrapper(Param(Constants.WRAPPER) QueryWrapperUser wrapper);实际项目中我建议80%的常规查询用Wrapper解决15%的复杂查询用XML剩下5%的特殊场景可以考虑原生JDBC。这种比例分配在可维护性和开发效率之间取得了较好平衡。
返回列表