当前位置: 首页 > news >正文

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)
http://www.jsqmd.com/news/364861/

相关文章:

  • 联邦学习系统测试:分布式数据下的模型验证
  • AI写论文必知!4款AI论文写作工具,让你告别论文写作的烦恼!
  • AI写论文的秘密武器!4款AI论文写作工具,解决论文写作痛点!
  • 直接上结论:更贴合MBA需求的AI论文写作软件,千笔ai写作 VS speedai
  • 高效管理AI项目的绝佳利器:Maestro
  • 导航特效 JS一键实现hover文本打乱效果
  • 【E3S出版,快速见刊检索】2026年可持续发展与城市规划国际学术会议(SDUP 2026)
  • [特殊字符] GenBI:轻松查询数据库,快速生成商业智能报告!
  • 在VisualStudio中配置汇编开发环境
  • 京东E卡回收攻略,教你快速变现! - 团团收购物卡回收
  • 数据结构与算法:Find All Anagrams in a String
  • 在 wsl 中安装 opencode
  • 2026年2月GEO公司哪家好?GEO服务商TOP9综合实力权威排行榜 - 资讯焦点
  • 护理床哪个牌子好?2026年最新品牌排行榜出炉 - 资讯焦点
  • 导师又让重写?AI论文平台 千笔AI VS PaperRed,本科生写作神器!
  • 小蓝翼家庭中央空调怎么样?TCL 空调引领行业技术发展 - 资讯焦点
  • GEO生成式引擎优化获国家级认可GEO理论创始人罗小军荣膺优秀作者 - 资讯焦点
  • 2026年全球GEO优化头部公司综合实力TOP 7权威榜单深度指南 - 资讯焦点
  • 苏果超市卡回收方法解析 - 资讯焦点
  • 手把手教你京东e卡回收变现,轻松搞定闲置卡 - 团团收购物卡回收
  • 2026年广东学校直饮水/校园饮水机/医院净水设备/办公室净水器口碑品牌综合评估报告 - 2026年企业推荐榜
  • 钢丝上的智能突围:企业AI创新与安全的动态平衡之道(2024-2026前瞻版)
  • 面向对象程序设计TODO
  • 当 MrBeast 遇上 Whatnot:揭秘超级碗背后的亿级流量支撑
  • 2026国产工业CT检测系统TOP10企业评测全解析 - 资讯焦点
  • 2026高口碑推荐:GMPC认证沐浴用品专业生产厂家 - 资讯焦点
  • 声网兄弟品牌 Agora:如何搞定 MrBeast 的超级碗级挑战?
  • 2026年护理床行业格局巨变:5大前沿品牌技术路线深度拆解 - 资讯焦点
  • 京东e卡回收变现全攻略:让闲置卡片秒变现金 - 团团收购物卡回收
  • 2026深圳儿童近视防控新标准:从南山到福田,为何数智化配镜成了刚需? - 资讯焦点