news 2026/4/23 18:37:31

mybatis-plus 基于 Mapper接口的 select

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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:分页查询结果转 Map
      • 10. selectCount:查询符合条件的总记录数

基于BaseMapper的crud

  • 通用 CRUD 封装 BaseMapper接口,
  • Mybatis-Plus 启动时,自动解析实体表关系映射转换为 Mybatis 内部对象注入容器,内部包含常见的单表操作

总结

  1. 条件构建:优先使用LambdaQueryWrapper替代QueryWrapper,避免硬编码数据库列名导致错误。
  2. 关键注意点
    • selectOne:条件匹配多条记录会抛异常,仅用于“唯一条件”场景;
    • selectByMap:Map 的 key 是数据库列名(不是实体属性名);
    • selectPage:必须先配置分页插件,否则分页失效(只会查所有数据);
  3. 空值处理selectList/selectMaps无匹配结果时返回空 List(不是 null),无需额外判空。


前置准备(必看)

先定义通用的实体类、Mapper 接口和注入方式,后续示例都基于此:

// 1. 实体类(对应数据库 user 表)@Data@TableName("user")// 指定数据库表名publicclassUser{@TableId(type=IdType.AUTO)// 主键自增privateLongid;// 数据库字段:id (BIGINT)privateStringuserName;// 数据库字段:user_name (VARCHAR)privateIntegerage;// 数据库字段:age (INT)privateStringemail;// 数据库字段:email (VARCHAR)}// 2. Mapper 接口(继承 BaseMapper)publicinterfaceUserMapperextendsBaseMapper<User>{}// 3. Spring Boot 环境下注入 Mapper(Service 层示例)@ServicepublicclassUserService{@AutowiredprivateUserMapperuserMapper;// 注入 Mapper,后续示例都用这个对象}

各方法使用示例(在 UserService 中编写)

1. selectById:根据 ID 查询单个实体

// 根据 ID=1 查询用户publicUsergetUserById(Longid){// 参数:主键 ID(支持 Integer/Long/String 等 Serializable 类型)Useruser=userMapper.selectById(1L);returnuser;}// 输出示例:User(id=1, userName="张三", age=20, email="zhangsan@test.com")

2. selectOne:根据条件查询单个记录

注意:如果匹配结果超过 1 条,会抛出TooManyResultsException异常,适合确定条件唯一的场景。

// 根据用户名查询单个用户(假设 userName 唯一)publicUsergetUserByUserName(StringuserName){// 构建查询条件:eq = equals(等于)QueryWrapper<User>queryWrapper=newQueryWrapper<User>().eq("user_name",userName);// 这里填数据库列名,或用 lambda 避免硬编码// Lambda 写法(推荐,避免列名写错):// LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<User>()// .eq(User::getUserName, userName);Useruser=userMapper.selectOne(queryWrapper);returnuser;}// 输入:userName="张三" → 输出:唯一匹配的 User 对象(无结果返回 null)

3. selectBatchIds:批量根据 ID 查询

// 批量查询 ID=1、2、3 的用户publicList<User>listUserByIds(){// 参数:ID 集合(List/Set 等 Collection 类型)List<Long>idList=Arrays.asList(1L,2L,3L);List<User>userList=userMapper.selectBatchIds(idList);returnuserList;}// 输出:包含 3 个 User 对象的 List(无匹配 ID 则对应位置无数据)

4. selectList:根据条件查询全部记录

// 查询年龄大于 18 且邮箱不为空的用户publicList<User>listUserByCondition(){QueryWrapper<User>queryWrapper=newQueryWrapper<User>().gt("age",18)// gt = greater than(大于).isNotNull("email");// 邮箱不为空List<User>userList=userMapper.selectList(queryWrapper);returnuserList;}// 输出:所有符合条件的 User 对象列表(无结果返回空 List,不会为 null)

5. selectByMap:根据 Map 条件查询

关键:Map 的key 是数据库列名(不是实体属性名),value 是匹配值,条件默认是“等于”。

// 查询 age=20 且 user_name="张三" 的用户publicList<User>listUserByMap(){Map<String,Object>columnMap=newHashMap<>();columnMap.put("age",20);// 数据库列名:agecolumnMap.put("user_name","张三");// 数据库列名:user_name(不是 userName)List<User>userList=userMapper.selectByMap(columnMap);returnuserList;}// 输出:符合条件的 User 列表(多条件默认 AND 关系)

6. selectMaps:查询结果转 Map 列表

适合不需要实体类、只需要部分字段的场景,Map 的 key 是数据库列名,value 是字段值。

// 查询年龄>18的用户的 id 和 user_namepublicList<Map<String,Object>>listUserMap(){QueryWrapper<User>queryWrapper=newQueryWrapper<User>().select("id","user_name")// 只查询指定列(减少数据传输).gt("age",18);List<Map<String,Object>>mapList=userMapper.selectMaps(queryWrapper);returnmapList;}// 输出示例:[{id=1, user_name=张三}, {id=2, user_name=李四}]

7. selectObjs:只返回第一个字段的值

不管查询的是哪些列,只取结果集中第一列的值,适合只需要主键 ID 列表的场景。

// 查询所有年龄>18的用户的 ID(只取第一列)publicList<Object>listUserId(){QueryWrapper<User>queryWrapper=newQueryWrapper<User>().select("id")// 显式指定第一列为 id(推荐).gt("age",18);List<Object>idList=userMapper.selectObjs(queryWrapper);returnidList;}// 输出示例:[1, 2, 3](Long 类型的 ID 被封装为 Object)

8. selectPage:分页查询(需先配置分页插件)

第一步:先配置 MyBatis-Plus 分页插件(Spring Boot 配置类):

@ConfigurationpublicclassMyBatisPlusConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();// 添加分页插件(适配 MySQL)interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}

第二步:分页查询示例:

// 分页查询:第 1 页,每页 10 条,条件:age>18publicIPage<User>pageUser(intpageNum,intpageSize){// 1. 构建分页对象(页码从 1 开始,不是 0)IPage<User>page=newPage<>(pageNum,pageSize);// 2. 构建查询条件QueryWrapper<User>queryWrapper=newQueryWrapper<User>().gt("age",18);// 3. 分页查询(结果会自动封装到 page 对象中)IPage<User>userPage=userMapper.selectPage(page,queryWrapper);// 分页结果常用属性longtotal=userPage.getTotal();// 总记录数longpages=userPage.getPages();// 总页数List<User>records=userPage.getRecords();// 当前页数据列表returnuserPage;}// 调用:pageUser(1, 10) → 输出第 1 页的 10 条数据,及总记录数/总页数

9. selectMapsPage:分页查询结果转 Map

用法和 selectPage 一致,只是返回结果是 Map 列表(适合不需要实体类的场景):

// 分页查询:第 1 页,每页 10 条,只查 id 和 user_namepublicIPage<Map<String,Object>>pageUserMap(intpageNum,intpageSize){IPage<Map<String,Object>>page=newPage<>(pageNum,pageSize);QueryWrapper<User>queryWrapper=newQueryWrapper<User>().select("id","user_name").gt("age",18);IPage<Map<String,Object>>mapPage=userMapper.selectMapsPage(page,queryWrapper);returnmapPage;}// 输出:分页对象中 records 是 Map 列表,包含 id 和 user_name 字段

10. selectCount:查询符合条件的总记录数

// 查询年龄>18的用户总数publicIntegercountUserByAge(){QueryWrapper<User>queryWrapper=newQueryWrapper<User>().gt("age",18);Integercount=userMapper.selectCount(queryWrapper);returncount;}// 输出:符合条件的记录数(比如 50)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:03:53

AI写论文的秘密武器!4款AI论文写作工具,解决论文写作痛点!

在2025年的学术写作智能化潮流中&#xff0c;越来越多的人开始借助AI写论文工具。在撰写硕士、博士论文等长篇学术论文时&#xff0c;这些工具常常存在理论深度不足和逻辑结构松散的问题。大部分普通的AI论文写作工具无法满足专业论文创作的需求&#xff0c;这使得很多学者感到…

作者头像 李华
网站建设 2026/4/23 13:04:33

跨境数据流测试:AI确保全球合规的复杂性

跨境数据流测试涉及验证数据在跨国传输、存储和处理中的合规性&#xff0c;需遵守GDPR、CCPA等多样化法规。全球合规的复杂性源于法规碎片化、实时更新及数据主权冲突&#xff0c;软件测试从业者需借助AI技术提升效率和精度。本报告从专业测试角度&#xff0c;分析AI如何应对这…

作者头像 李华
网站建设 2026/4/23 14:52:16

OpenAI最强编程智能体!GPT-5.3-Codex全面解析+一步API接入实操

前言&#xff1a;2026年2月6日&#xff0c;AI编程领域迎来激烈交锋——Claude发布Opus 4.6仅几分钟后&#xff0c;OpenAI火速推出最新编程模型GPT-5.3-Codex&#xff0c;号称“世界上最强大的智能体&#xff08;Agentic&#xff09;编程模型”。这款模型融合了前代优势&#xf…

作者头像 李华
网站建设 2026/4/23 13:01:35

Libvio.link反爬机制深度剖析

一、Libvio.link 反爬机制全景解析&#xff08;五层防御体系&#xff09; 根据2026年最新实测与逆向分析&#xff0c;Libvio.link 的反爬机制可分为以下五个层级&#xff1a; 1. 入口层&#xff1a;动态域名 入口封禁 表现&#xff1a;主域名频繁更换&#xff08;如 .link → …

作者头像 李华
网站建设 2026/4/23 13:02:47

springboot基于java的考研论坛系统(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 SpringBoot框架凭借其快速开发、微服务支持及丰富的第三方库集成能力&#xff0c;为构建高效、稳定…

作者头像 李华
网站建设 2026/4/23 13:03:39

Xtra 2.53.6 | Twitch直播第三方客户端,开源纯净无广

Xtra for Twitch是一款针对Twitch平台的客户端应用&#xff0c;旨在为移动设备用户提供优质的观看与聊天体验。它借助BetterTTV和FrankerFaceZ插件&#xff0c;支持流行表情符号&#xff1b;具备观看带有聊天室重播的VOD与剪辑功能&#xff0c;还能下载VOD实现离线观看&#xf…

作者头像 李华