作者:zinghoWU

时间:2026-01-27 22:07:17 星期二

前言

MyBatis 作为持久层框架,简化了 JDBC 操作的同时,也提供了丰富的增强特性来应对复杂的业务场景。本文整理了 MyBatis 中参数处理、动态 SQL、关联关系映射等核心增强知识点,结合实际业务场景和核心代码,帮助理解 MyBatis 进阶用法。

一、MyBatis 参数处理

在 MyBatis 中,参数传递是高频操作,不同的参数类型有不同的处理方式,核心目标是让 SQL 能精准获取到参数值。

1.1 核心场景:登录功能(用户名 + 密码比对)

需求:通过传入的用户名和密码,查询数据库中是否存在匹配的用户,核心是参数的正确传递。

1.2 三种常用参数传递方式

方式 1:封装 Map 传递参数

点击查看代码
// 1. 测试代码(Service/测试类)
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "admin");
paramMap.put("password", "123456");
User user = userMapper.loginByMap(paramMap);

// 2. Mapper接口
User loginByMap(Map<String, Object> paramMap);

// 3. Mapper映射文件
<select id="loginByMap" resultType="com.zingho.pojo.User">
    select * from user where username = #{username} and password = #{password}
</select>

方式 2:封装实体类传递参数
定义实体类封装参数,Mapper 映射文件通过实体类属性名取值

点击查看代码
// 1. 实体类
@Data
public class User {
    private String username;
    private String password;
}

// 2. Mapper接口
User loginByUser(User user);

// 3. Mapper映射文件
<select id="loginByUser" resultType="com.zingho.pojo.User">
    select * from user where username = #{username} and password = #{password}
</select>

方式 3:@Param 注解传递参数

点击查看代码
// 1. Mapper接口
User loginByParam(@Param("username") String username, @Param("password") String password);

// 2. Mapper映射文件
<select id="loginByParam" resultType="com.zingho.pojo.User">
    select * from user where username = #{username} and password = #{password}
</select>

1.3 补充:

List / 数组参数处理
MyBatis 会自动将 List / 数组封装到 Map 中:
List 类型:默认 Key 为 list
数组类型:默认 Key 为 array

可通过 @Param 自定义 Key,示例如下:

点击查看代码
// Mapper接口
List<User> getUserByIds(@Param("ids") List<Long> ids);

// Mapper映射文件
<select id="getUserByIds" resultType="com.zingho.pojo.User">
    select * from user where id in
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

二、#{} 与 ${} 的核心区别

特性 #{} ${}
取值逻辑 预编译,自动给值加单引号 直接拼接,值作为 SQL 一部分
安全性 防 SQL 注入 存在 SQL 注入风险
适用场景 普通参数传递(字段值) 动态字段(order by/group by)

三、动态 SQL

动态 SQL 是 MyBatis 核心增强特性,能根据参数动态拼接 SQL,解决多条件查询、动态更新等场景

3.1 if + where:多条件查询

需求:查询工资大于等于指定值的员工,若参数为空则查询所有员工。

点击查看代码
<select id="getEmpBySal" resultType="com.zingho.pojo.Emp">
    select * from emp
    <where>
        <if test="minSal != null">
            sal >= #{minSal}
        </if>
    </where>
</select>

where 标签:自动去除拼接后多余的 and/or,避免 SQL 语法错误。

3.2 set:动态更新

点击查看代码
<update id="updateEmp">
    update emp
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="sal != null">sal = #{sal},</if>
    </set>
    where id = #{id}
</update>

set 标签:自动去除最后一个字段后的逗号,保证 UPDATE 语法正确

3.3 foreach:批量删除

点击查看代码
<delete id="batchDeleteEmp">
    delete from emp where id in
    <foreach collection="array" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>
1. collection:数组填array,List 填list(或 @Param 自定义名); 2. item:遍历的单个元素; 3. open/close:包裹遍历结果的字符; 4. separator:元素间分隔符。

四、关联关系映射

实际业务中,实体间存在一对一、一对多、多对多关联,MyBatis 提供了关联查询的解决方案。

总结

MyBatis 增强特性围绕 “灵活适配业务场景” 展开:参数处理解决不同类型参数的传递问题,动态 SQL 解决 SQL 拼接的繁琐,关联关系映射解决实体间的关联查询。掌握这些特性,能大幅提升 MyBatis 开发效率,应对复杂的业务需求。

posted on 2026-01-27 22:33  zinghoWU  阅读(0)  评论(0)    收藏  举报