MyBatis 参数传递详解

MyBatis 是一个强大的持久层框架,支持多种方式将参数传递给 SQL 语句,以实现数据库操作。在使用 MyBatis 进行开发时,正确理解和使用参数传递机制对于构建高效、可维护的应用至关重要。本文将详细介绍 MyBatis 中常见的参数传递方式及其使用场景。

1. 单参数传递

MyBatis 支持将单个参数传递给 SQL 语句,这种方式在简单的查询或操作中非常常见。

1.1 基本数据类型参数

假设我们有一个用户表 users,包含字段 id、name 和 email。下面演示如何通过用户 ID 查询用户信息。

Mapper 接口
java 复制代码
package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(int id);
}
XML 映射文件
xml 复制代码
<select id="selectUserById" resultType="com.example.mybatisdemo.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

2. 多参数传递

当我们需要传递多个参数时,可以使用以下几种方式。

2.1 使用 @Param 注解

使用 @Param 注解可以为每个参数指定一个名称,在 SQL 语句中通过名称引用参数。

Mapper 接口
java 复制代码
package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("SELECT * FROM users WHERE name = #{name} AND email = #{email}")
    User selectUserByNameAndEmail(@Param("name") String name, @Param("email") String email);
}
XML 映射文件
xml 复制代码
<select id="selectUserByNameAndEmail" parameterType="map" resultType="com.example.mybatisdemo.model.User">
    SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>

2.2 使用 Map 传递参数

另一种方式是使用 Map 传递参数,这种方式尤其适合参数数量较多的场景。

Mapper 接口
java 复制代码
package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

public interface UserMapper {
    @Select("SELECT * FROM users WHERE name = #{name} AND email = #{email}")
    User selectUserByMap(Map<String, Object> params);
}
XML 映射文件
xml 复制代码
<select id="selectUserByMap" parameterType="map" resultType="com.example.mybatisdemo.model.User">
    SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>
测试代码
java 复制代码
package com.example.mybatisdemo;

import com.example.mybatisdemo.mapper.UserMapper;
import com.example.mybatisdemo.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean(UserMapper.class);

        // 使用 Map 传递参数
        Map<String, Object> params = new HashMap<>();
        params.put("name", "John Doe");
        params.put("email", "john.doe@example.com");
        User user = userMapper.selectUserByMap(params);
        System.out.println("Selected user: " + user);
    }
}

3. 使用对象传递参数

在面向对象编程中,使用对象传递参数是一种常见且方便的方式。MyBatis 支持将对象作为参数传递给 SQL 语句。

3.1 通过对象传递参数

User 类
java 复制代码
package com.example.mybatisdemo.model;

public class User {
    private int id;
    private String name;
    private String email;

    // Getters and Setters

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}';
    }
}
Mapper 接口
java 复制代码
package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("SELECT * FROM users WHERE name = #{name} AND email = #{email}")
    User selectUserByObject(User user);
}
XML 映射文件
xml 复制代码
<select id="selectUserByObject" parameterType="com.example.mybatisdemo.model.User" resultType="com.example.mybatisdemo.model.User">
    SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>
测试代码
java 复制代码
package com.example.mybatisdemo;

import com.example.mybatisdemo.mapper.UserMapper;
import com.example.mybatisdemo.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean(UserMapper.class);

        // 使用对象传递参数
        User paramUser = new User();
        paramUser.setName("John Doe");
        paramUser.setEmail("john.doe@example.com");
        User user = userMapper.selectUserByObject(paramUser);
        System.out.println("Selected user: " + user);
    }
}

4. 动态 SQL 中的参数传递

MyBatis 提供了强大的动态 SQL 功能,通过在 XML 映射文件中使用 if、choose、trim 等标签,可以根据传入参数的不同生成不同的 SQL 语句。

4.1 动态查询示例

XML 映射文件
xml 复制代码
<select id="selectUserByDynamicSql" resultType="com.example.mybatisdemo.model.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            name = #{name}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>
Mapper 接口
java 复制代码
package com.example.mybatisdemo.mapper;

import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;

public interface UserMapper {
    @SelectProvider(type=UserSqlProvider.class, method="selectUserByDynamicSql")
    User selectUserByDynamicSql(@Param("name") String name, @Param("email") String email);
}
UserSqlProvider 类
java 复制代码
package com.example.mybatisdemo.mapper;

import org.apache.ibatis.jdbc.SQL;

public class UserSqlProvider {
    public String selectUserByDynamicSql(final String name, final String email) {
        return new SQL() {{
            SELECT("*");
            FROM("users");
            if (name != null) {
                WHERE("name = #{name}");
            }
            if (email != null) {
                WHERE("email = #{email}");
            }
        }}.toString();
    }
}
测试代码
java 复制代码
package com.example.mybatisdemo;

import com.example.mybatisdemo.mapper.UserMapper;
import com.example.mybatisdemo.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean(UserMapper.class);

        // 动态 SQL 查询
        User user = userMapper.selectUserByDynamicSql("John Doe", "john.doe@example.com");
        System.out.println("Selected user: " + user);
    }
}

5. 总结

本文介绍了 MyBatis 中常见的参数传递方式,包括单参数、多参数、对象参数和动态 SQL 中的参数传递。通过合理使用这些参数传递方式,可以灵活地构建各种复杂的数据库查询和操作。

MyBatis 提供了丰富的参数传递机制,能够满足不同场景下的需求。掌握这些机制,能够大大提升开发效率和代码的可维护性。希望本文能帮助你更好地理解和使用 MyBatis 的参数传递功能。

相关推荐
布吉岛的石头15 分钟前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记34 分钟前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
紧跟先前的步伐1 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵1 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨1 小时前
spring auth 核心流程详解
java·后端·spring
文丑颜不良啊3 小时前
LeetCode201~225题目解析
java·leetcode
SL_staff5 小时前
4G设备掉线三层归因指南:SIM卡、模组、JVS-IOT网关配置精准锁定
java·物联网·产品
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
杨杨杨大侠6 小时前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff6 小时前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈