Mybatis 多条件查询常见且关键,本文探讨两种方法——Map 传参和 Java Bean 对象传参,展示用法及区别,总结应用场景和优缺点。
1. Map传参方式
原理:Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中占位符的名称,值则是实际的参数值。
代码示例:
Mybatis全局配置文件示例片段。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 数据源配置 --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><!-- 映射器配置,可以自动扫描包中的Mapper接口 --><mappers><package name="com.example.dao.mapper"/><!-- 或者单独指定Mapper XML文件 --><!-- <mapper resource="com/example/dao/mapper/UserMapper.xml"/> --></mappers>
</configuration>
根据 Map 键值对生成 SQL 条件,实现多条件动态查询。
// DAO层方法定义
public List<User> findUsers(Map<String, Object> params);// Service层调用
Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("age", 25);
List<User> users = userDao.findUsers(params);// Mapper.xml配置
<select id="findUsers" resultType="com.example.User">SELECT * FROM user <where><if test="name != null">name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
2. 对象传参方式
原理:另一种方式是直接使用Java Bean对象作为参数传递给Mapper接口方法。Mybatis会自动将对象的属性名映射为SQL中的参数名。
代码示例:
创建 UserQueryParams 类封装查询条件,传递给 Mapper 方法,Mybatis 自动处理对象属性到 SQL 参数映射。
// 定义一个用于传递查询条件的Java Bean
public class UserQueryParams {private String name;private Integer age;// ... getters and setters
}// DAO层方法定义
public List<User> findUsers(UserQueryParams queryParams);// Service层调用
UserQueryParams queryParams = new UserQueryParams();
queryParams.setName("John");
queryParams.setAge(25);
List<User> users = userDao.findUsers(queryParams);// Mapper.xml配置
<select id="findUsers" resultType="com.example.User">SELECT * FROM user <where><if test="queryParams.name != null">name = #{queryParams.name}</if><if test="queryParams.age != null">AND age = #{queryParams.age}</if></where>
</select>
3. 区别总结
Map 传参:灵活,无需定义 Java Bean,适用于临时或多变查询条件。
对象传参:结构清晰,可读性强,适用于固定、复杂查询条件组合,借助 IDE 自动补全提高开发效率,便于维护扩展,适用于有预定义模型的业务场景,如用户搜索界面多种筛选条件对应 Java Bean 属性。