select 复杂和动态查询

注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码

前面章节介绍了 BaseMapper 中简单 select 方法的用法,本章节将介绍复杂的 select 查询和动态 select 查询。

复杂 select 查询

在 BaseMapper 中,定义了如下四个方法:

// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

上面四个方法将根据给定的 Wrapper 查询条件或者 Map 对象返回结果列表,而且列表类型可以是实体、Map<String,Object>、Object。

示例代码

(1)下面将根据 userId、姓名和年龄查询条件创建一个 Wrapper 条件对象,查询用户列表。代码如下:

package com.hxstrive.mybatis_plus.select;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxstrive.mybatis_plus.mapper.SimpleMapper;
import com.hxstrive.mybatis_plus.model.UserBean;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
class Select2Test {

    @Autowired
    private SimpleMapper simpleMapper;

    @Test
    void contextLoads() {
        query(1, null, null);
        query(1, "赫仑", null);
        query(1, "赫仑", 27);
    }

    private void query(int userId, String name, Integer age) {
        System.out.println("\n查询数据:");
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", userId);

        // 第一个参数为是否执行条件,为true则执行该条件
        // 下面实现根据 name 和 age 动态查询
        wrapper.eq(StringUtils.isNotEmpty(name), "name", name);
        wrapper.eq(null != age, "age", age);

        List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
        for(UserBean userBean : userBeanList) {
            System.out.println(userBean);
        }
    }

}

(2)使用 Map 作为查询条件参数,代码如下:

package com.hxstrive.mybatis_plus.select;

import com.hxstrive.mybatis_plus.mapper.SimpleMapper;
import com.hxstrive.mybatis_plus.model.UserBean;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
class Select3Test {

    @Autowired
    private SimpleMapper simpleMapper;

    @Test
    void contextLoads() {
        query(1, null, null);
        query(1, "赫仑", null);
        query(1, "赫仑", 27);
    }

    private void query(int userId, String name, Integer age) {
        System.out.println("\n查询数据:");
        Map<String,Object> map = new HashMap<>();
        map.put("user_id", userId);

        // 第一个参数为是否执行条件,为true则执行该条件
        // 下面实现根据 name 和 age 动态查询
        if(StringUtils.isNotEmpty(name)) {
            map.put("name", name);
        }
        if(null != age) {
            map.put("age", age);
        }

        List<UserBean> userBeanList = simpleMapper.selectByMap(map);
        for(UserBean userBean : userBeanList) {
            System.out.println(userBean);
        }
    }

}

另外两个方法用法和上面两个方法使用方式一样,只不过返回的 List 对象类型不一样而已。

动态 select 查询

在上面的查询中,你会发现“wrapper.eq(null != age, "age", age);”语句的第一个参数是一个布尔值。当该布尔值为 true 时,则将该条件应用到结果集中。类似 XML 文件的 <if> 标签,等同于下面 Mapper XML:

<if test="null != age">
    and age=#{age}
</if>

有了这个布尔参数,我们就可以根据传递的条件动态选择查询条件。

例如:下面将根据用户ID、用户名和年龄查询数据,如果用户名为空,则不使用名称进行查询;如果 age 为 null,则不使用 age 进行查询。代码如下:

private void query(int userId, String name, Integer age) {
    System.out.println("\n查询数据:");
    QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
    wrapper.eq("user_id", userId);

    // 第一个参数为是否执行条件,为true则执行该条件
    // 下面实现根据 name 和 age 动态查询
    wrapper.eq(StringUtils.isNotEmpty(name), "name", name);
    wrapper.eq(null != age, "age", age);

    List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
    for(UserBean userBean : userBeanList) {
        System.out.println(userBean);
    }
}

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号