注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “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); } }