首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Mybatis多条件查询:Map传参与对象传参解析

Mybatis多条件查询:Map传参与对象传参解析

原创
作者头像
Yeats_Liao
发布2025-01-04 09:27:58
发布2025-01-04 09:27:58
1.7K0
举报

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

1. Map传参方式

原理:Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中占位符的名称,值则是实际的参数值。

代码示例

Mybatis全局配置文件示例片段。

代码语言:java
复制
<?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 条件,实现多条件动态查询。

代码语言:java
复制
// 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
复制
// 定义一个用于传递查询条件的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 属性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 1. Map传参方式
  • 2. 对象传参方式
  • 3. 区别总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档