• MyBatis 参数传递详解


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

    1. 单参数传递

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

    1.1 基本数据类型参数

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

    Mapper 接口
    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 映射文件
    <select id="selectUserById" resultType="com.example.mybatisdemo.model.User">
        SELECT * FROM users WHERE id = #{id}
    select>
    

    2. 多参数传递

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

    2.1 使用 @Param 注解

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

    Mapper 接口
    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 映射文件
    <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 接口
    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 映射文件
    <select id="selectUserByMap" parameterType="map" resultType="com.example.mybatisdemo.model.User">
        SELECT * FROM users WHERE name = #{name} AND email = #{email}
    select>
    
    测试代码
    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 类
    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 接口
    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 映射文件
    <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>
    
    测试代码
    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 映射文件中使用 ifchoosetrim 等标签,可以根据传入参数的不同生成不同的 SQL 语句。

    4.1 动态查询示例

    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 接口
    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 类
    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();
        }
    }
    
    测试代码
    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 的参数传递功能。

  • 相关阅读:
    mysql使用orderby 不起作用
    wirehark数据分析与取证hack.pcapng
    乾坤微服务的使用
    深入解析:开发抖音酒店景区小程序的技术
    Spring Data MongoDB 使用
    花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在....
    SQL Alias 别名
    Flow公链 |FCL1.0正式上线
    shell编程之条件表达式
    25_ue4进阶末日生存游戏开发[行为树进阶]
  • 原文地址:https://blog.csdn.net/FireFox1997/article/details/139709965