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

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

plain 复制代码
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
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
java 复制代码
List<Emp> findByPojo(QueryPojo pojo); // 接收 POJO 参数
2.2 XML 动态查询配置 EmpMapper.xml
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} 通过嵌套对象访问 Emp 的 name 属性

三、测试类实现

3.1 测试代码 Test01.java
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:
sql 复制代码
SELECT * FROM emp 
WHERE 
    salary >= 6000.00 
    AND salary <= 8000.00 
    AND name LIKE '%小%'

四、核心优势与注意事项

4.1 优势
  1. 参数集中管理 :
    • 将散落的参数封装为对象,提高代码可读性
  2. 支持复杂查询 :
    • 可嵌套对象、集合等复杂结构
  3. 动态 SQL 友好 :
    • 结合 <if> 标签实现条件过滤:
xml 复制代码
<if test="start != null">
    AND salary >= #{start}
</if>
4.2 注意事项
  1. 属性访问规则 :
    • MyBatis 通过 getter 方法访问属性,需确保 QueryPojo 和 Emp 类有对应的 getter(或使用 Lombok)
  2. 模糊查询语法 :
    • 通配符 % 应在 Java 代码中设置(如 %小%),而非 XML 中拼接,避免 SQL 注入风险
  3. 空值处理 :
    • 若 emp 为 null,#{emp.name} 会抛出 NullPointerException,建议初始化对象:
java 复制代码
public class QueryPojo {
    private Emp emp = new Emp(); // 防御性初始化
}

五、完整代码对照

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

六、扩展应用

  1. 动态条件增强 :
    结合 <where> 和 <if> 标签实现可选条件查询:
xml 复制代码
<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 中添加 pageNum 和 pageSize 字段,结合 PageHelper 插件实现分页:
java 复制代码
PageHelper.startPage(pojo.getPageNum(), pojo.getPageSize());
List<Emp> list = mapper.findByPojo(pojo);
相关推荐
正儿八经的少年1 天前
MyBatis 一对一、一对多 SQL
数据库·sql·mybatis
paopaokaka_luck2 天前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
代码不停3 天前
MyBatis操作数据库
数据库·mybatis
wno7043 天前
Spring Boot中JdbcTemplate与Mybatis使用PostgreSQL
spring boot·postgresql·mybatis
lzhdim4 天前
100条常用SQL语句
数据库·sql·mysql·mybatis
景熙55234 天前
2.什么是业务后台系统
java·spring·tomcat·mybatis·jdbc
2601_962885725 天前
AkShare 和 Tushare 哪个好?区别、场景与选型
mybatis
_Evan_Yao6 天前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
paopaokaka_luck6 天前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
2301_32241428046 天前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis