MyBatis-Plus如何实现普通查询

发布时间:2021-12-15 11:42:51 作者:小新
来源:亿速云 阅读:366
# 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 查询优化技巧

九、常见问题解答

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

推荐阅读:
  1. thinkphp-where-数组条件-普通查询
  2. mybatis-plus如何实现多表查询

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

mybatis mybatis-plus

上一篇:MyBatis-Plus如何配置环境

下一篇:Mybatis相关概念的示例分析

相关阅读

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

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