温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MyBatis-Plus如何实现普通查询

发布时间:2021-12-15 11:42:51 来源:亿速云 阅读:387 作者:小新 栏目:大数据
# 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> 

2.2 实体类配置

@Data @TableName("user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; private String email; } 

2.3 Mapper接口

public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper即拥有基本CRUD方法 } 

三、基础查询方法

3.1 根据ID查询

// 通过主键查询 User user = userMapper.selectById(1L); // 批量主键查询 List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L)); 

3.2 条件构造器查询

3.2.1 QueryWrapper基础用法

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); 

3.2.2 常用条件方法

方法名 说明 示例
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))

3.3 Lambda查询

LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "张三") .gt(User::getAge, 20); List<User> users = userMapper.selectList(lambdaWrapper); 

四、高级查询功能

4.1 排序查询

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.orderByAsc("age") // 按年龄升序 .orderByDesc("create_time"); // 按创建时间降序 

4.2 分页查询

// 配置分页插件 @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); 

4.3 聚合查询

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("avg(age) as avgAge", "max(age) as maxAge"); Map<String, Object> map = userMapper.selectMaps(wrapper).get(0); 

4.4 分组查询

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("age, count(*) as userCount") .groupBy("age") .having("count(*) > 1"); List<Map<String, Object>> list = userMapper.selectMaps(wrapper); 

五、复杂条件组合

5.1 AND/OR嵌套

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.nested(i -> i.eq("name", "张三").or().eq("name", "李四")) .and(i -> i.gt("age", 20).lt("age", 30)); 

5.2 动态条件拼接

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); } 

六、自定义SQL查询

6.1 注解方式

@Select("select * from user where age > #{age}") List<User> selectByAge(@Param("age") Integer age); 

6.2 XML方式

<!-- UserMapper.xml --> <select id="selectByName" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%',#{name},'%') </select> 

七、查询结果处理

7.1 返回Map

List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); 

7.2 返回指定列

QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("id", "name", "email"); 

7.3 结果集映射

@Data public class UserVO { private Long userId; private String userName; } @Select("select id as userId, name as userName from user") List<UserVO> selectUserVOs(); 

八、性能优化建议

8.1 索引使用建议

  • 为常用查询条件建立索引
  • 避免在索引列上使用函数
  • 遵循最左前缀原则

8.2 查询优化技巧

  • 只查询需要的列(避免select *)
  • 合理使用批量查询
  • 对大表查询使用分页
  • 缓存常用查询结果

九、常见问题解答

9.1 如何打印SQL日志?

# application.properties mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 

9.2 如何处理字段名与属性名不一致?

@TableField(value = "db_column") // 指定数据库字段名 private String myField; 

9.3 如何实现逻辑删除?

// 实体类添加注解 @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的查询功能,可以显著提高开发效率,减少样板代码,让开发者更专注于业务逻辑的实现。 “`

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI