当前位置: 首页 > ai >正文

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. 封装查询参数到 POJOQueryPojo pojo = new QueryPojo();pojo.setEmp(emp);pojo.setStart(6000.00);  // 薪资范围:6000~8000pojo.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);
http://www.xdnf.cn/news/2772.html

相关文章:

  • leetcode继续c++10/100
  • UDP数据报和TCP流套接字编程
  • BUUCTF——Online Tool
  • 日本IT行业|salesforce开发语言占据的地位
  • Java后端开发day39--方法引用
  • 如何系统学习音视频
  • gitmodule怎么维护
  • 千问3(Qwen3)模型开源以及初体验
  • 设计模式(工厂模式)
  • Android Studio Profiler
  • 矩阵区域和 --- 前缀和
  • 【计算机视觉】目标检测:深度解析YOLOv5:下一代实时目标检测框架实战指南
  • 《图像采集与处理技术的研究与洞察》
  • 从架构原理到落地实践:Apache SeaTunnel×Cloudberry数据集成全解读
  • SQL命令一:SQL 基础操作与建表约束
  • 解决 Flutter 在 iOS 真机上构建失败的问题
  • 使用Qt QAxObject解决Visual Fox Pro数据库乱码问题
  • Token-Budget-Aware LLM Reasoning
  • c网络库libevent的http常用函数的使用(附带源码)
  • 玩玩OCR
  • RPC复习
  • 【MCP Node.js SDK 全栈进阶指南】高级篇(5):MCP之微服务架构
  • 对话式 BI:让数据洞察从“专业门槛”变为“对话本能”
  • 多模态知识图谱与大模型 图解合集(干中学ing)
  • 【机器学习】​碳化硅器件剩余使用寿命稀疏数据深度学习预测
  • matplotlib
  • 阿里云服务器(ECS)基础指南:从入门到核心场景解析​
  • 【网络入侵检测】基于源码分析Suricata的统计模块
  • python裁剪小说封面标题
  • 防洪评价报告编制方法及洪水建模实践技术-防洪评价报告编制方法及洪水建模实践技术