MyBatis使用POJO参数动态查询教程的实现

 更新时间:2026年01月26日 10:00:15   作者:Yrui.  
本文主要介绍了MyBatis使用POJO参数动态查询教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

项目结构概览(基于图片描述):

mybatis02
├─ src/main/java
│  └─ cn.cjxy
│     ├─ domain      # 实体类(如 Emp.java)
│     ├─ mapper      # Mapper 接口(如 EmpMapper.java)
│     └─ pojo        # 查询参数 POJO(如 QueryPojo.java)
├─ src/main/resources
│  ├─ cn.cjxy.mapper # XML 映射文件(如 EmpMapper.xml)
│  └─ mybatis-config.xml

一、POJO 参数定义

1.1 查询参数封装类QueryPojo.java

package cn.cjxy.pojo;

import cn.cjxy.domain.Emp;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryPojo {
    private Emp emp;     // 嵌套对象(用于模糊查询名称)
    private Double start; // 薪资范围下限
    private Double end;   // 薪资范围上限
}
  • Lombok 注解作用
    • @Data:自动生成 getter/setter
    • @NoArgsConstructor:无参构造器
    • @AllArgsConstructor:全参构造器

二、Mapper 接口与 XML 映射配置

2.1 Mapper 接口方法EmpMapper.java

List<Emp> findByPojo(QueryPojo pojo); // 接收 POJO 参数

2.2 XML 动态查询配置EmpMapper.xml

<select id="findByPojo" resultType="cn.cjxy.domain.Emp">
    SELECT * FROM emp 
    WHERE 
        salary >= #{start} 
        AND salary <= #{end} 
        AND name LIKE #{emp.name} <!-- 访问嵌套对象属性 -->
</select>
  • 关键点
    • #{start}#{end} 直接访问 QueryPojo 的成员变量
    • #{emp.name} 通过嵌套对象访问 Empname 属性

三、测试类实现

3.1 测试代码Test01.java

@Test
public void testFindByPojo() throws IOException {
    // 1. 创建 Emp 对象并设置模糊查询条件
    Emp emp = new Emp();
    emp.setName("%小%");  // 包含"小"的任意位置

    // 2. 封装查询参数到 POJO
    QueryPojo pojo = new QueryPojo();
    pojo.setEmp(emp);
    pojo.setStart(6000.00);  // 薪资范围:6000~8000
    pojo.setEnd(8000.00);

    // 3. 执行查询
    List<Emp> empList = mapper.findByPojo(pojo);

    // 4. 输出结果
    empList.forEach(System.out::println);
}

3.2 执行流程

  1. 参数构建
    • 创建 Emp 对象,设置 name 为模糊查询条件 %小%
    • Emp 对象及薪资范围封装到 QueryPojo
  2. SQL 动态生成
    • MyBatis 解析 #{emp.name} → 获取 emp.getName()
    • 最终生成 SQL:
SELECT * FROM emp 
WHERE 
    salary >= 6000.00 
    AND salary <= 8000.00 
    AND name LIKE '%小%'

四、核心优势与注意事项

4.1优势

  1. 参数集中管理
    • 将散落的参数封装为对象,提高代码可读性
  2. 支持复杂查询
    • 可嵌套对象、集合等复杂结构
  3. 动态 SQL 友好
    • 结合 <if> 标签实现条件过滤:
<if test="start != null">
    AND salary >= #{start}
</if>

4.2注意事项

  1. 属性访问规则
    • MyBatis 通过 getter 方法访问属性,需确保 QueryPojoEmp 类有对应的 getter(或使用 Lombok)
  2. 模糊查询语法
    • 通配符 % 应在 Java 代码中设置(如 %小%),而非 XML 中拼接,避免 SQL 注入风险
  3. 空值处理
    • empnull#{emp.name} 会抛出 NullPointerException,建议初始化对象:
public class QueryPojo {
    private Emp emp = new Emp(); // 防御性初始化
}

五、完整代码对照

文件关键代码
QueryPojo.java封装 Emp 对象及薪资范围
EmpMapper.javaList<Emp> findByPojo(QueryPojo pojo);
EmpMapper.xml通过 #{start}, #{end}, #{emp.name} 动态拼接 SQL
Test01.java构建 QueryPojo 参数并调用 Mapper 方法

六、扩展应用

  1. 动态条件增强
    结合 <where><if> 标签实现可选条件查询:
<select id="findByPojo" resultType="cn.cjxy.domain.Emp">
    SELECT * FROM emp 
    <where>
        <if test="start != null">AND salary >= #{start}</if>
        <if test="end != null">AND salary <= #{end}</if>
        <if test="emp.name != null">AND name LIKE #{emp.name}</if>
    </where>
</select>
  1. 分页查询整合
    QueryPojo 中添加 pageNumpageSize 字段,结合 PageHelper 插件实现分页:
PageHelper.startPage(pojo.getPageNum(), pojo.getPageSize());
List<Emp> list = mapper.findByPojo(pojo);

到此这篇关于MyBatis使用POJO参数动态查询教程的文章就介绍到这了,更多相关MyBatis POJO参数动态查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring mvc 和ajax异步交互完整实例代码

    spring mvc 和ajax异步交互完整实例代码

    本篇文章主要介绍了spring mvc 和ajax异步交互完整实例代码,简单的AJAX+SpringMVC的异步交互小例子,有兴趣的可以了解一下。
    2017-02-02
  • Java框架MyBatis接口编程过程解析

    Java框架MyBatis接口编程过程解析

    这篇文章主要介绍了Java框架MyBatis接口编程过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java中的List接口实现类解析

    Java中的List接口实现类解析

    这篇文章主要介绍了Java中的List接口实现类解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Windows系统下Eclipse搭建ESP32编译环境及安装过程

    Windows系统下Eclipse搭建ESP32编译环境及安装过程

    Ecppse 使用了 ESP-IDF 中的 Makefile 支持。这意味着您需要从创建 ESP-IDF 项目开始。您可以使用 github 中的 idf-template 项目,接下来通过本文给大家介绍Windows系统下Eclipse搭建ESP32编译环境及安装过程,感兴趣的朋友一起看看吧
    2021-10-10
  • 深入解析@InitBinder注解的功能与应用

    深入解析@InitBinder注解的功能与应用

    这篇文章主要介绍了深入解析@InitBinder注解的功能与应用,从字面意思可以看出这个的作用是给Binder做初始化的,被此注解的方法可以对WebDataBinder初始化,webDataBinder是用于表单到方法的数据绑定的,需要的朋友可以参考下
    2023-10-10
  • Java中性能优化的35种方法汇总

    Java中性能优化的35种方法汇总

    很多同学在日常写Java的时候很少去关心性能问题,但是在我们写代码的过程中必须考虑到性能对程序的影响。小到我们使用位运算来实现算术运算,大到我们对 Java 代码的总体架构设计,性能其实离我们很近。本文介绍了Java中性能优化的35种方法,需要的朋友可以参考下。
    2017-01-01
  • Java构造方法和方法重载详解

    Java构造方法和方法重载详解

    大家好,本篇文章主要讲的是Java构造方法和方法重载详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java面试题冲刺第二十七天--JVM2

    Java面试题冲刺第二十七天--JVM2

    这篇文章主要为大家分享了最有价值的三道关于JVM的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java并发编程service层处理并发事务加锁可能会无效问题

    Java并发编程service层处理并发事务加锁可能会无效问题

    这篇文章主要介绍了Java并发编程service层处理并发事务加锁可能会无效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java中处理日期时间的几种操作技巧

    Java中处理日期时间的几种操作技巧

    日期和时间是几乎所有应用程序中都会遇到的问题,从简单的显示当前时间,到复杂的日期计算和时区处理,日期时间操作是开发中不可避免的一部分,Java提供了不同的工具来帮助我们处理日期和时间,本文为大家详细说说,需要的朋友可以参考下
    2026-01-01

最新评论