使用 MyBatis XML 和 QueryWrapper 实现动态查询

本文档介绍了如何在 MyBatis 中结合 XML 配置和 MyBatis-Plus 的 QueryWrapper 来实现动态查询。

1. XML 中定义基本查询

首先,在 MyBatis XML 文件中定义一个基本的 select 查询:

xml 复制代码
<select id="selectCode" resultType="java.util.Map">
    SELECT * FROM order
</select>

2. 在 Mapper 接口中定义方法

在 Mapper 接口中定义一个方法,接受 QueryWrapper 作为参数:

java 复制代码
package com.example.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.order.entity.Order;
import org.apache.ibatis.annotations.Param;
import java.util.Map;

public interface OrderMapper extends BaseMapper<Order> {
    IPage<Map<String, Object>> selectCode(Page<Map<String, Object>> page, @Param("ew") QueryWrapper<Order> queryWrapper);
}

3. 在 Service 层使用 QueryWrapper

在 Service 层中使用 QueryWrapper 来构建动态查询条件,并传递给 Mapper 方法:

java 复制代码
package com.example.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.order.dtc.request.OrderQuery;
import com.example.order.entity.Order;
import com.example.order.mapper.OrderMapper;
import com.example.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public IPage<Map<String, Object>> selectCode(Page<Map<String, Object>> page, OrderQuery query) {
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();

        // Add filtering
        if (query.getFilterField() != null && query.getFilterValue() != null) {
            queryWrapper.eq(query.getFilterField(), query.getFilterValue());
        }

        // Add sorting
        if (query.getSortBy() != null) {
            if (query.isAscending()) {
                queryWrapper.orderByAsc(query.getSortBy());
            } else {
                queryWrapper.orderByDesc(query.getSortBy());
            }
        }

        return orderMapper.selectCode(page, queryWrapper);
    }
}

4. XML 中使用动态 SQL

在 XML 中,使用 whereif 标签来处理动态条件:

xml 复制代码
<select id="selectCode" resultType="java.util.Map" parameterType="com.baomidou.mybatisplus.core.conditions.Wrapper">
    SELECT * FROM order
    <where>
        <if test="ew != null">
            ${ew.sqlSegment}
        </if>
    </where>
</select>

说明

  • @Param("ew") : 在 Mapper 方法中使用 @Param("ew") 注解来传递 QueryWrapperew 是 MyBatis-Plus 约定的参数名。
  • 动态 SQL : 在 XML 中使用 ${ew.sqlSegment} 来插入 QueryWrapper 构建的 SQL 片段。
  • 灵活性 : 这种方式结合了 XML 的灵活性和 QueryWrapper 的动态条件构建能力。

通过这种方式,您可以在 XML 中定义基本的查询逻辑,并在 Java 代码中使用 QueryWrapper 来动态添加查询条件和排序。

相关推荐
PacosonSWJTU13 小时前
(转)mybatis拦截器
数据库·redis·mybatis
程序员小崔日记17 小时前
一篇文章带你入门漏洞靶场:从 0 到 1 玩转 bWAPP(附完整安装教程)
xml·网络安全·漏洞学习·靶场搭建
二等饼干~za89866817 小时前
豆包GEO优化源码开发全解析:技术架构、实现逻辑与实操指南
数据库·sql·重构·架构·mybatis·音视频
星晨雪海18 小时前
MyBatis-Plus 常用 CRUD 方法大全
linux·tomcat·mybatis
yangyanping2010819 小时前
广告系统设计二之RTA系统设计
java·spring·mybatis
Boop_wu20 小时前
[Mybatis] MyBatis 快速入门教程(2)
mybatis
※DX3906※20 小时前
SpringBoot之旅4: MyBatis 操作数据库(进阶) 动态SQL+MyBatis-Plus实战,从入门到熟练,再也不踩绑定异常、SQL拼接坑
java·数据库·spring boot·spring·java-ee·maven·mybatis
柒.梧.1 天前
Redis持久化详解:RDB与AOF的核心原理及使用指南
mybatis
mygljx1 天前
SpringBoot+Mybatis-plus实现分页查询(一看就会)
spring boot·mybatis·状态模式
独断万古他化2 天前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis