家具网站后台模板,做电影网站 资源怎么存放,阿里巴巴国际站的前台网址是,网站排名提升软件问题#xff1a;用户发起的MP多条件模糊查询怎么通过wrapper来实现#xff0c;查询条件封装再请求参数中解决#xff1a;你想知道如何基于请求参数封装的多条件#xff0c;通过 Wrapper 实现多条件模糊查询#xff0c;我会结合实际开发场景#xff08;Spring Boot#x…问题用户发起的MP多条件模糊查询怎么通过wrapper来实现查询条件封装再请求参数中解决你想知道如何基于请求参数封装的多条件通过 Wrapper 实现多条件模糊查询我会结合实际开发场景Spring Boot从请求参数封装、Wrapper 构建、完整代码示例三个核心步骤讲清楚确保代码可直接复用一、核心思路梳理封装请求参数创建 DTO 类接收前端传递的多查询条件比如用户名、手机号、性别等判空处理仅当参数非空 / 非空字符串时才添加对应的模糊查询条件避免查空值导致无结果Wrapper 构建用LambdaQueryWrapper推荐避免硬编码字段名链式添加like模糊查询条件执行查询调用 MP 的selectList/selectPage方法执行查询。二、完整代码示例以用户多条件模糊查询为例步骤 1创建请求参数 DTO接收前端查询条件import lombok.Data; ​ /** * 用户多条件查询的请求参数DTO * 前端传递的查询条件会封装到这个类中 */ Data public class UserQueryDTO { // 用户名模糊查询 private String userName; // 手机号模糊查询 private String phone; // 性别精确查询可作为对比 private Integer gender; // 邮箱模糊查询 private String email; }步骤 2Mapper/Service 层基础准备// 1. User实体类核心字段示例 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; ​ Data TableName(sys_user) public class User { TableId(type IdType.AUTO) private Long id; private String userName; // 用户名 private String phone; // 手机号 private Integer gender; // 性别 1-男 2-女 private String email; // 邮箱 } ​ // 2. UserMapper接口 import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.springframework.stereotype.Repository; ​ Repository public interface UserMapper extends BaseMapperUser { } ​ // 3. UserService可选也可直接在Controller调用Mapper import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; ​ Service public class UserService { ​ Autowired private UserMapper userMapper; ​ /** * 多条件模糊查询用户 * param queryDTO 前端传递的查询条件 * return 符合条件的用户列表 */ public ListUser queryUserByCondition(UserQueryDTO queryDTO) { // 1. 创建LambdaQueryWrapper推荐避免字段名硬编码 LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); ​ // 2. 多条件模糊查询仅参数非空时添加条件核心 // 用户名模糊查询like %xxx% if (queryDTO.getUserName() ! null !queryDTO.getUserName().trim().isEmpty()) { wrapper.like(User::getUserName, queryDTO.getUserName().trim()); } // 手机号模糊查询like %xxx% if (queryDTO.getPhone() ! null !queryDTO.getPhone().trim().isEmpty()) { wrapper.like(User::getPhone, queryDTO.getPhone().trim()); } // 邮箱模糊查询like %xxx% if (queryDTO.getEmail() ! null !queryDTO.getEmail().trim().isEmpty()) { wrapper.like(User::getEmail, queryDTO.getEmail().trim()); } // 性别精确查询作为对比非模糊 if (queryDTO.getGender() ! null) { wrapper.eq(User::getGender, queryDTO.getGender()); } ​ // 3. 可选添加排序比如按ID降序 wrapper.orderByDesc(User::getId); ​ // 4. 执行查询 return userMapper.selectList(wrapper); } }步骤 3Controller 层接收前端请求import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; ​ RestController RequestMapping(/user) public class UserController { ​ Autowired private UserService userService; ​ /** * 多条件模糊查询用户接口 * 前端请求示例/user/query?userName张phone138gender1 * param queryDTO 请求参数自动封装 * return 用户列表 */ GetMapping(/query) public ListUser queryUser(ModelAttribute UserQueryDTO queryDTO) { return userService.queryUserByCondition(queryDTO); } }三、关键细节说明1. 模糊查询的不同写法按需选择方法效果适用场景like(User::getUserName, 张)user_name like %张%包含 “张” 的模糊查询最常用likeLeft(User::getUserName, 张)user_name like %张以 “张” 结尾的查询likeRight(User::getUserName, 张)user_name like 张%以 “张” 开头的查询2. 为什么用LambdaQueryWrapper而不是QueryWrapperQueryWrapper写法不推荐wrapper.like(user_name, 张)—— 字段名硬编码容易写错比如把user_name写成username编译期无法发现LambdaQueryWrapper写法wrapper.like(User::getUserName, 张)—— 基于 Lambda 获取字段名编译期校验避免拼写错误。3. 空值处理的重要性如果不判空当前端传递空字符串比如userNameMP 会生成user_name like %%会查询出所有数据不符合业务预期因此必须先判断参数是否为null且非空字符串trim()避免全空格的情况。4. 分页 多条件模糊查询扩展如果需要分页只需把selectList换成selectPage// Service层添加分页方法 public IPageUser queryUserByConditionPage(PageUser page, UserQueryDTO queryDTO) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); // 同上添加模糊查询条件... return userMapper.selectPage(page, wrapper); } ​ // Controller层调用 GetMapping(/query/page) public IPageUser queryUserPage( ModelAttribute UserQueryDTO queryDTO, RequestParam(defaultValue 1) Integer current, RequestParam(defaultValue 10) Integer size) { PageUser page new Page(current, size); return userService.queryUserByConditionPage(page, queryDTO); }总结多条件模糊查询的核心是先封装请求参数 DTO再判空后通过 LambdaQueryWrapper 链式添加 like 条件必须做参数判空处理避免生成like %%导致查询所有数据优先使用LambdaQueryWrapper避免字段名硬编码错误可结合like/likeLeft/likeRight实现不同模糊查询效果也可叠加分页、排序等功能。进阶分页的多条件模糊查询分页 多条件模糊查询的具体实现方式其实核心是在之前多条件模糊查询的基础上叠加 MP 的分页插件和selectPage方法即可。关键步骤如下一、核心实现思路先确保分页插件已配置这是分页功能生效的前提封装分页参数当前页、每页条数和查询条件参数构建LambdaQueryWrapper添加多条件模糊查询规则调用selectPage方法而非selectList执行分页查询返回包含分页信息和数据列表的IPage对象。二、完整代码实现基于上一轮的用户查询场景步骤 1确认分页插件已配置必做import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; ​ Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加MySQL分页插件其他数据库需对应修改DbType interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }步骤 2请求参数封装包含分页 查询条件import lombok.Data; ​ /** * 分页多条件查询的请求参数DTO * 前端传递当前页、每页条数、用户名、手机号、性别等 */ Data public class UserPageQueryDTO { // 分页参数前端不传则用默认值第1页每页10条 private Integer current 1; // 当前页 private Integer size 10; // 每页条数 ​ // 模糊查询条件 private String userName; // 用户名模糊 private String phone; // 手机号模糊 private Integer gender; // 性别精确对比用 private String email; // 邮箱模糊 }步骤 3Service 层实现分页 多条件模糊查询import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; ​ Service public class UserService { ​ Autowired private UserMapper userMapper; ​ /** * 分页多条件模糊查询用户 * param queryDTO 包含分页参数和查询条件 * return 分页结果总条数、总页数、当前页数据 */ public IPageUser queryUserByPage(UserPageQueryDTO queryDTO) { // 1. 构建分页对象封装当前页、每页条数 PageUser page new Page(queryDTO.getCurrent(), queryDTO.getSize()); ​ // 2. 构建条件构造器添加多条件模糊查询规则 LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); // 用户名模糊查询非空才添加条件 if (queryDTO.getUserName() ! null !queryDTO.getUserName().trim().isEmpty()) { wrapper.like(User::getUserName, queryDTO.getUserName().trim()); } // 手机号模糊查询只匹配开头比如138开头 if (queryDTO.getPhone() ! null !queryDTO.getPhone().trim().isEmpty()) { wrapper.likeRight(User::getPhone, queryDTO.getPhone().trim()); } // 邮箱模糊查询包含匹配 if (queryDTO.getEmail() ! null !queryDTO.getEmail().trim().isEmpty()) { wrapper.like(User::getEmail, queryDTO.getEmail().trim()); } // 性别精确查询对比用 if (queryDTO.getGender() ! null) { wrapper.eq(User::getGender, queryDTO.getGender()); } ​ // 可选添加排序规则按创建时间降序 wrapper.orderByDesc(User::getId); ​ // 3. 执行分页查询核心是selectPage方法 // MP会自动拼接LIMIT语句返回包含分页信息的IPage对象 return userMapper.selectPage(page, wrapper); } }步骤 4Controller 层接收请求并返回结果import com.baomidou.mybatisplus.core.metadata.IPage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; ​ RestController RequestMapping(/user) public class UserController { ​ Autowired private UserService userService; ​ /** * 分页多条件模糊查询接口 * 前端请求示例/user/query/page?current1size10userName张phone138gender1 * param queryDTO 自动封装分页参数和查询条件 * return 分页结果 */ GetMapping(/query/page) public IPageUser queryUserByPage(UserPageQueryDTO queryDTO) { return userService.queryUserByPage(queryDTO); } }三、关键细节说明1. 分页结果IPage的核心属性前端常用属性名含义示例值current当前页码1size每页条数10total符合条件的总记录数28pages总页数3records当前页的数据列表[User{id:1, userName:张三}, ...]2. 为什么分页要先配置插件分页插件PaginationInnerInterceptor的作用是拦截 SQL自动拼接 LIMIT 语句如果不配置插件selectPage会退化为全表查询后内存分页先查所有数据再截取当前页数据量大时性能极差。3. 模糊查询的灵活用法方法SQL 效果适用场景like(User::getUserName, 张)user_name like %张%包含 “张”最常用likeRight(User::getPhone, 138)phone like 138%手机号 / 身份证开头匹配likeLeft(User::getEmail, qq.com)email like %qq.com邮箱后缀匹配4. 空值处理的坑必避如果不判空前端传空字符串如userName会生成user_name like %%导致查询所有数据建议对字符串参数做trim()处理避免前端传全空格如userName 导致的无效查询。5. 性能优化大数据量场景模糊查询尽量用likeRightxxx%可命中字段索引like %xxx%会走全表扫描分页查询的size建议控制在 50 条以内避免单次查询数据过多。四、前端调用示例返回 JSON 格式{ records: [ {id: 1, userName: 张三, phone: 13800001111, gender: 1, email: zhangsanqq.com}, {id: 2, userName: 张四, phone: 13800002222, gender: 1, email: zhangs四163.com} ], total: 28, size: 10, current: 1, pages: 3 }总结分页 多条件模糊查询的核心是分页插件 Page 对象 LambdaQueryWrapper 条件 selectPage 方法必须先配置分页插件否则会触发内存分页性能极差条件构建时要做好空值判断避免无效查询IPage对象会返回完整的分页信息前端可直接用这些属性做分页控件渲染。