mybatis-plus 基于 Mapper接口的 select

📅 发布时间:2026/7/12 7:26:40 👁️ 浏览次数:
mybatis-plus 基于 Mapper接口的 select
文章目录基于BaseMapper的crud总结前置准备必看各方法使用示例在 UserService 中编写1. selectById根据 ID 查询单个实体2. selectOne根据条件查询单个记录3. selectBatchIds批量根据 ID 查询4. selectList根据条件查询全部记录5. selectByMap根据 Map 条件查询6. selectMaps查询结果转 Map 列表7. selectObjs只返回第一个字段的值8. selectPage分页查询需先配置分页插件9. selectMapsPage分页查询结果转 Map10. selectCount查询符合条件的总记录数基于BaseMapper的crud通用 CRUD 封装 BaseMapper接口Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器内部包含常见的单表操作总结条件构建优先使用LambdaQueryWrapper替代QueryWrapper避免硬编码数据库列名导致错误。关键注意点selectOne条件匹配多条记录会抛异常仅用于“唯一条件”场景selectByMapMap 的 key 是数据库列名不是实体属性名selectPage必须先配置分页插件否则分页失效只会查所有数据空值处理selectList/selectMaps无匹配结果时返回空 List不是 null无需额外判空。前置准备必看先定义通用的实体类、Mapper 接口和注入方式后续示例都基于此// 1. 实体类对应数据库 user 表DataTableName(user)// 指定数据库表名publicclassUser{TableId(typeIdType.AUTO)// 主键自增privateLongid;// 数据库字段id (BIGINT)privateStringuserName;// 数据库字段user_name (VARCHAR)privateIntegerage;// 数据库字段age (INT)privateStringemail;// 数据库字段email (VARCHAR)}// 2. Mapper 接口继承 BaseMapperpublicinterfaceUserMapperextendsBaseMapperUser{}// 3. Spring Boot 环境下注入 MapperService 层示例ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;// 注入 Mapper后续示例都用这个对象}各方法使用示例在 UserService 中编写1. selectById根据 ID 查询单个实体// 根据 ID1 查询用户publicUsergetUserById(Longid){// 参数主键 ID支持 Integer/Long/String 等 Serializable 类型UseruseruserMapper.selectById(1L);returnuser;}// 输出示例User(id1, userName张三, age20, emailzhangsantest.com)2. selectOne根据条件查询单个记录注意如果匹配结果超过 1 条会抛出TooManyResultsException异常适合确定条件唯一的场景。// 根据用户名查询单个用户假设 userName 唯一publicUsergetUserByUserName(StringuserName){// 构建查询条件eq equals等于QueryWrapperUserqueryWrappernewQueryWrapperUser().eq(user_name,userName);// 这里填数据库列名或用 lambda 避免硬编码// Lambda 写法推荐避免列名写错// LambdaQueryWrapperUser lambdaWrapper new LambdaQueryWrapperUser()// .eq(User::getUserName, userName);UseruseruserMapper.selectOne(queryWrapper);returnuser;}// 输入userName张三 → 输出唯一匹配的 User 对象无结果返回 null3. selectBatchIds批量根据 ID 查询// 批量查询 ID1、2、3 的用户publicListUserlistUserByIds(){// 参数ID 集合List/Set 等 Collection 类型ListLongidListArrays.asList(1L,2L,3L);ListUseruserListuserMapper.selectBatchIds(idList);returnuserList;}// 输出包含 3 个 User 对象的 List无匹配 ID 则对应位置无数据4. selectList根据条件查询全部记录// 查询年龄大于 18 且邮箱不为空的用户publicListUserlistUserByCondition(){QueryWrapperUserqueryWrappernewQueryWrapperUser().gt(age,18)// gt greater than大于.isNotNull(email);// 邮箱不为空ListUseruserListuserMapper.selectList(queryWrapper);returnuserList;}// 输出所有符合条件的 User 对象列表无结果返回空 List不会为 null5. selectByMap根据 Map 条件查询关键Map 的key 是数据库列名不是实体属性名value 是匹配值条件默认是“等于”。// 查询 age20 且 user_name张三 的用户publicListUserlistUserByMap(){MapString,ObjectcolumnMapnewHashMap();columnMap.put(age,20);// 数据库列名agecolumnMap.put(user_name,张三);// 数据库列名user_name不是 userNameListUseruserListuserMapper.selectByMap(columnMap);returnuserList;}// 输出符合条件的 User 列表多条件默认 AND 关系6. selectMaps查询结果转 Map 列表适合不需要实体类、只需要部分字段的场景Map 的 key 是数据库列名value 是字段值。// 查询年龄18的用户的 id 和 user_namepublicListMapString,ObjectlistUserMap(){QueryWrapperUserqueryWrappernewQueryWrapperUser().select(id,user_name)// 只查询指定列减少数据传输.gt(age,18);ListMapString,ObjectmapListuserMapper.selectMaps(queryWrapper);returnmapList;}// 输出示例[{id1, user_name张三}, {id2, user_name李四}]7. selectObjs只返回第一个字段的值不管查询的是哪些列只取结果集中第一列的值适合只需要主键 ID 列表的场景。// 查询所有年龄18的用户的 ID只取第一列publicListObjectlistUserId(){QueryWrapperUserqueryWrappernewQueryWrapperUser().select(id)// 显式指定第一列为 id推荐.gt(age,18);ListObjectidListuserMapper.selectObjs(queryWrapper);returnidList;}// 输出示例[1, 2, 3]Long 类型的 ID 被封装为 Object8. selectPage分页查询需先配置分页插件第一步先配置 MyBatis-Plus 分页插件Spring Boot 配置类ConfigurationpublicclassMyBatisPlusConfig{BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();// 添加分页插件适配 MySQLinterceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}第二步分页查询示例// 分页查询第 1 页每页 10 条条件age18publicIPageUserpageUser(intpageNum,intpageSize){// 1. 构建分页对象页码从 1 开始不是 0IPageUserpagenewPage(pageNum,pageSize);// 2. 构建查询条件QueryWrapperUserqueryWrappernewQueryWrapperUser().gt(age,18);// 3. 分页查询结果会自动封装到 page 对象中IPageUseruserPageuserMapper.selectPage(page,queryWrapper);// 分页结果常用属性longtotaluserPage.getTotal();// 总记录数longpagesuserPage.getPages();// 总页数ListUserrecordsuserPage.getRecords();// 当前页数据列表returnuserPage;}// 调用pageUser(1, 10) → 输出第 1 页的 10 条数据及总记录数/总页数9. selectMapsPage分页查询结果转 Map用法和 selectPage 一致只是返回结果是 Map 列表适合不需要实体类的场景// 分页查询第 1 页每页 10 条只查 id 和 user_namepublicIPageMapString,ObjectpageUserMap(intpageNum,intpageSize){IPageMapString,ObjectpagenewPage(pageNum,pageSize);QueryWrapperUserqueryWrappernewQueryWrapperUser().select(id,user_name).gt(age,18);IPageMapString,ObjectmapPageuserMapper.selectMapsPage(page,queryWrapper);returnmapPage;}// 输出分页对象中 records 是 Map 列表包含 id 和 user_name 字段10. selectCount查询符合条件的总记录数// 查询年龄18的用户总数publicIntegercountUserByAge(){QueryWrapperUserqueryWrappernewQueryWrapperUser().gt(age,18);IntegercountuserMapper.selectCount(queryWrapper);returncount;}// 输出符合条件的记录数比如 50