# MyBatis-Plus如何实现普通查询 ## 一、MyBatis-Plus简介 ### 1.1 MyBatis-Plus概述 MyBatis-Plus(简称MP)是MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,简化开发、提高效率。它提供了通用的Mapper和Service封装,通过少量配置即可实现单表大部分CRUD操作。 ### 1.2 核心特性 - **无侵入**:只做增强不做改变 - **损耗小**:启动即会自动注入基本CRUD - **强大的CRUD操作**:内置通用Mapper、通用Service - **支持Lambda形式调用**:通过Lambda表达式编写查询条件 - **支持主键自动生成**:支持多种主键策略 - **内置分页插件**:无需额外配置 - **内置性能分析插件**:可输出SQL语句及其执行时间 ## 二、环境准备 ### 2.1 添加依赖 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency>
@Data @TableName("user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; private String email; }
public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper即拥有基本CRUD方法 }
// 通过主键查询 User user = userMapper.selectById(1L); // 批量主键查询 List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "张三") // name = '张三' .gt("age", 20) // age > 20 .isNotNull("email"); // email is not null List<User> users = userMapper.selectList(wrapper);
方法名 | 说明 | 示例 |
---|---|---|
eq | 等于 = | eq(“name”, “张三”) |
ne | 不等于 <> | ne(“name”, “张三”) |
gt | 大于 > | gt(“age”, 18) |
ge | 大于等于 >= | ge(“age”, 18) |
lt | 小于 < | lt(“age”, 65) |
le | 小于等于 <= | le(“age”, 65) |
between | BETWEEN 值1 AND 值2 | between(“age”, 18, 30) |
like | LIKE ‘%值%’ | like(“name”, “张”) |
notLike | NOT LIKE ‘%值%’ | notLike(“name”, “张”) |
in | 字段 IN (值1, 值2…) | in(“age”, Arrays.asList(18,20)) |
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "张三") .gt(User::getAge, 20); List<User> users = userMapper.selectList(lambdaWrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.orderByAsc("age") // 按年龄升序 .orderByDesc("create_time"); // 按创建时间降序
// 配置分页插件 @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } // 分页查询 Page<User> page = new Page<>(1, 10); // 当前页,每页大小 Page<User> result = userMapper.selectPage(page, null);
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("avg(age) as avgAge", "max(age) as maxAge"); Map<String, Object> map = userMapper.selectMaps(wrapper).get(0);
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("age, count(*) as userCount") .groupBy("age") .having("count(*) > 1"); List<Map<String, Object>> list = userMapper.selectMaps(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.nested(i -> i.eq("name", "张三").or().eq("name", "李四")) .and(i -> i.gt("age", 20).lt("age", 30));
public List<User> queryUsers(String name, Integer minAge, Integer maxAge) { QueryWrapper<User> wrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(name)) { wrapper.like("name", name); } if (minAge != null) { wrapper.ge("age", minAge); } if (maxAge != null) { wrapper.le("age", maxAge); } return userMapper.selectList(wrapper); }
@Select("select * from user where age > #{age}") List<User> selectByAge(@Param("age") Integer age);
<!-- UserMapper.xml --> <select id="selectByName" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%') </select>
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("id", "name", "email");
@Data public class UserVO { private Long userId; private String userName; } @Select("select id as userId, name as userName from user") List<UserVO> selectUserVOs();
# application.properties mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@TableField(value = "db_column") // 指定数据库字段名 private String myField;
// 实体类添加注解 @TableLogic private Integer deleted; // 全局配置 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
MyBatis-Plus提供了丰富而强大的查询功能,从简单的ID查询到复杂的动态条件组合,都能通过简洁的API实现。通过合理使用条件构造器、Lambda表达式和自定义SQL,可以满足绝大多数业务场景的查询需求。同时,MyBatis-Plus的性能优化建议也能帮助开发者编写更高效的查询语句。
在实际开发中,建议: 1. 优先使用Lambda表达式保证类型安全 2. 复杂查询考虑使用自定义SQL 3. 注意SQL注入风险,避免拼接SQL 4. 合理使用缓存提高查询性能
通过掌握MyBatis-Plus的查询功能,可以显著提高开发效率,减少样板代码,让开发者更专注于业务逻辑的实现。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。