
Mybatis 多条件查询常见且关键,本文探讨两种方法——Map 传参和 Java Bean 对象传参,展示用法及区别,总结应用场景和优缺点。

原理:Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中占位符的名称,值则是实际的参数值。
代码示例:
Mybatis全局配置文件示例片段。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//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>原理:另一种方式是直接使用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>Map 传参:灵活,无需定义 Java Bean,适用于临时或多变查询条件。
对象传参:结构清晰,可读性强,适用于固定、复杂查询条件组合,借助 IDE 自动补全提高开发效率,便于维护扩展,适用于有预定义模型的业务场景,如用户搜索界面多种筛选条件对应 Java Bean 属性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。