MyBatisPlus自定义查询

本文介绍了一个用于查询已生成且已审核的需求单所关联的生产计划的方法。该方法通过MyBatis的映射文件定义SQL语句,并在Service层提供业务逻辑处理,最终在Controller层响应请求。
PurchaseMapper.java
/**
 * 查询所有已生成已审核的需求单的生产计划
 */
public IPage<ProductionPlan> getYetReqProductionPlan(Page page,String productionPlanId);
PurchaseMapper.xml(注意模糊查询sql的写法)
<select id="getYetReqProductionPlan" resultType="usst.mrpproject.bean.ProductionPlan">
    select * from production_plan WHERE production_plan_id in (SELECT production_plan_id FROM purchases WHERE auditStatus='已通过'
    <if test="productionPlanId !=null and productionPlanId !=''">
        AND production_plan_id like  concat('%',#{productionPlanId,jdbcType=VARCHAR},'%')
    </if>
    <if test="productionPlanId ==null or productionPlanId ==''">AND production_plan_id IS NOT NULL</if>)
</select>
service.java
public IPage<ProductionPlan> getYetReqProductionPlan(Page page,String productionPlanId);
Controller
    @RequestMapping("/loadAuditProductionPlan")
    public DataGridView loadAuditProductionPlan(ProductionPlanVo productionPlanVo){
        Page<ProductionPlan> page=new Page(productionPlanVo.getPage(), productionPlanVo.getLimit());
        //查询条件为产生了已审核的需求单的生产计划
       IPage<ProductionPlan> result = purchaseService.getYetReqProductionPlan(page,productionPlanVo.getProductionPlanId());
        return new DataGridView(result.getTotal(),result.getRecords());
    }
<think>首先,用户的问题是基于之前的引用内容:他们想查找MyBatis-Plus自定义查询的相关内容,如方法、示例、教程等。具体问题是:“请问MyBatis-Plus自定义查询的方法和示例”。 回顾提供的引用: - 引用[1]讨论了如何自定义通用方法,通过研究内部实现。 - 引用[2]提到了查询方法,并推荐官方文档。 - 引用[3]展示了自定义分页查询的示例,使用QueryWrapper和Page。 - 引用[4]讨论了自定义分页查询方法的重写和注意事项。 用户指定参考这些引用,所以我需要基于这些内容来构建回答。回答必须是结构清晰的中文,并遵循系统指令:使用$...$和$$...$$格式,添加引用标识,生成相关问题等。 ### 回答结构 1. **介绍自定义查询的必要性**:解释为什么需要自定义查询,以及MyBatis-Plus提供了哪些内建方法。 2. **自定义方法的实现方式**:基于引用[1],讨论如何通过研究内部方法来自定义。 3. **示例:自定义分页查询**:重点使用引用[3]中的代码示例,展示如何实现自定义查询分页。 4. **注意事项**:参考引用[4],提到重写方法时的注意事项。 5. **推荐资源**:基于引用[2],推荐官方文档。 6. **生成相关问题**:在末尾添加相关问题部分。 ### 关键点 - 使用中文。 - 对数学表达式使用合适的格式,但用户问题涉及的是Java代码,所以可能主要是代码块。系统指令说“行内数学表达式”,但这里是编程查询,所以我应该使用代码块来展示示例。 - 添加引用标识:在关键点后添加[^n]。 - 生成至少3个相关问题。 ### 内容组织 - **引言**:简述自定义查询在MyBatis-Plus中的作用。 - **方法部分**:描述自定义查询的方法。 - **示例部分**:提供一个完整的示例代码,基于引用[3]。 - **注意事项**:基于引用[4],提醒注意事项。 - **结论和资源推荐**:指向官方文档[^2]。 - **相关问题**:生成相关问题。 ### 代码格式 - 使用代码块来展示Java代码。 - 确保LaTeX语法正确,但如果涉及数学,才使用$...$格式。这里主要是文本和代码。 引用中提到了一些查询,但如果不涉及数学,就不需要强制使用LaTeX。系统指令是针对数学表达式的,所以只有在必要时才使用。 ### 生成相关问题 基于内容,生成3个相关问题: 1. 如何优化MyBatis-Plus自定义查询的性能? 2. 自定义查询中的QueryWrapper如何使用高级条件? 3. MyBatis-Plus自定义SQL语句的编写规范是什么? ### 引用标识 在回答中,当引用某个部分时,添加: - [^1] for Ref1 - [^2] for Ref2 - [^3] for Ref3 - [^4] for Ref4 ### 完整回答框架 1. MyBatis-Plus自定义查询介绍 2. 实现自定义查询的方法 - 基于内部实现研究[^1] 3. 示例:自定义分页查询代码 - 展示代码块 4. 注意事项 - 引用[^4] 5. 资源推荐 - 官方文档[^2] 6. 相关问题 </think>### MyBatis-Plus自定义查询的方法和示例 MyBatis-Plus(MP)提供了丰富的内建方法(如条件查询、分页等),但当业务需求复杂时,需要自定义查询方法。自定义查询允许开发者扩展MP的核心功能,例如编写特定SQL语句或优化查询逻辑。下面我将基于引用内容,逐步解释方法和提供示例。 #### 1. **自定义查询的实现方法** - **研究内部实现机制**:MP的自定义方法通常通过继承或重写Mapper接口实现。核心类是`BaseMapper`,内建方法(如`selectList`)基于QueryWrapper构建SQL。自定义时,需理解MP的动态SQL生成原理,避免与内建方法冲突[^1]。 - **步骤概述**: 1. 在Mapper接口中定义自定义方法(例如 `selectPageByCustom`)。 2. 在XML文件或注解中编写对应的SQL语句。 3. 使用`@Param`注解传递参数,确保类型安全。 4. 在Service层调用自定义方法。 #### 2. **自定义查询的示例:分页查询** 以下是一个完整的自定义分页查询示例,基于引用[3]的代码。该示例演示了如何结合QueryWrapper和自定义逻辑实现分页查询。 ```java // Mapper接口定义 public interface UserMapper extends BaseMapper<User> { // 自定义分页查询方法,使用@Param传递实体和分页参数 IPage<Map<String, Object>> selectCustomPage( @Param("page") Page<User> pageInfo, @Param("query") QueryWrapper<User> queryWrapper ); } ``` ```java // Service实现类 @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<Map<String, Object>> findUsersByPage(int pageNum, int pageSize) { // 构建分页条件对象 Page<User> page = new Page<>(pageNum, pageSize); // 自定义查询条件(QueryWrapper) QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByDesc("faddtime495"); // 按字段降序排序 // 调用自定义Mapper方法 IPage<Map<String, Object>> resultPage = userMapper.selectCustomPage(page, queryWrapper); // 获取结果集和总条数 List<Map<String, Object>> records = resultPage.getRecords(); long total = resultPage.getTotal(); System.out.println("总记录数: " + total); return records; // 返回查询结果 } } ``` **代码解析**: - **QueryWrapper**:用于动态构建查询条件(如`orderByDesc`指定排序),替代原生SQL中的WHERE子句。 - **Page对象**:封装分页参数(页码和每页大小),MP自动处理分页逻辑。 - **返回值类型**:`IPage<Map<String, Object>>`允许灵活返回Map或实体对象,便于处理非标准数据结构[^3]。 - **注意事项**:重写Mapper方法时,需确保参数名(如`@Param("page")`)与XML/注解中的占位符一致,否则可能抛出SQL异常[^4]。 #### 3. **注意事项** - **参数传递**:自定义方法必须明确参数类型。例如,引用[4]强调使用`@Param`注解避免MyBatis参数绑定错误: ```java IPage<User> selectPage(@Param("page") Page pageContext, @Param("entity") User entity); ``` - **性能优化**:复杂查询建议使用自定义SQL替代内建方法,减少MP的动态解析开销[^1]。 - **错误处理**:自定义SQL需测试分页插件的兼容性,避免`PageHelper`与MP分页冲突。 #### 4. **推荐学习资源** - **官方文档**:MyBatis-Plus官方中文文档详细覆盖了所有查询方法,包括自定义示例和最佳实践(引用[2])。访问地址:[MyBatis-Plus官网](https://baomidou.com/)。 - **进阶教程**:参考官方示例仓库学习高级用法,如联表查询或存储过程集成。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值