本文档介绍了如何在 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 中,使用 where
和 if
标签来处理动态条件:
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")
注解来传递QueryWrapper
,ew
是 MyBatis-Plus 约定的参数名。- 动态 SQL : 在 XML 中使用
${ew.sqlSegment}
来插入QueryWrapper
构建的 SQL 片段。 - 灵活性 : 这种方式结合了 XML 的灵活性和
QueryWrapper
的动态条件构建能力。
通过这种方式,您可以在 XML 中定义基本的查询逻辑,并在 Java 代码中使用 QueryWrapper
来动态添加查询条件和排序。