MyBatis使用POJO参数动态查询教程的实现
作者: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}通过嵌套对象访问Emp的name属性
三、测试类实现
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 执行流程
- 参数构建:
- 创建
Emp对象,设置name为模糊查询条件%小% - 将
Emp对象及薪资范围封装到QueryPojo
- 创建
- SQL 动态生成:
- MyBatis 解析
#{emp.name}→ 获取emp.getName() - 最终生成 SQL:
- MyBatis 解析
SELECT * FROM emp
WHERE
salary >= 6000.00
AND salary <= 8000.00
AND name LIKE '%小%'
四、核心优势与注意事项
4.1优势
- 参数集中管理:
- 将散落的参数封装为对象,提高代码可读性
- 支持复杂查询:
- 可嵌套对象、集合等复杂结构
- 动态 SQL 友好:
- 结合
<if>标签实现条件过滤:
- 结合
<if test="start != null">
AND salary >= #{start}
</if>4.2注意事项
- 属性访问规则:
- MyBatis 通过
getter方法访问属性,需确保QueryPojo和Emp类有对应的getter(或使用 Lombok)
- MyBatis 通过
- 模糊查询语法:
- 通配符
%应在 Java 代码中设置(如%小%),而非 XML 中拼接,避免 SQL 注入风险
- 通配符
- 空值处理:
- 若
emp为null,#{emp.name}会抛出NullPointerException,建议初始化对象:
- 若
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 方法 |
六、扩展应用
- 动态条件增强:
结合<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>- 分页查询整合:
在QueryPojo中添加pageNum和pageSize字段,结合PageHelper插件实现分页:
PageHelper.startPage(pojo.getPageNum(), pojo.getPageSize()); List<Emp> list = mapper.findByPojo(pojo);
到此这篇关于MyBatis使用POJO参数动态查询教程的文章就介绍到这了,更多相关MyBatis POJO参数动态查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
