注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
前面章节介绍了 BaseMapper 中简单 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 对象类型不一样而已。
在上面的查询中,你会发现“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);
}
}