• MyBatis框架中各种参数类型绑定的方式


    MyBatis框架中各种参数类型绑定的方式

    一、MyBatis参数绑定

    MyBatis框架中,通过Mapper接口和Mapper映射文件的方式来操作数据库的时候,可能需要通过Mapper接口中的方法传递相应的参数拼接到SQL语句上面,那么Mybatis将传递的参数映射到对应SQL上面的过程,我们就叫做参数绑定。下面介绍MyBatis框架里面,几种常见的参数绑定类型。

    1.1、单个参数

    当Mapper接口里面的方法只有一个参数的时候,这个时候参数名称和Mapper映射文件里面的参数名称可以不一致,为什么呢???因为你这个方法既然只有一个参数,MyBatis就只能使用这一个参数,那这个参数叫什么名称也就没有什么规定了。

    • 创建Mapper接口方法。
    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/7 12:14
     * @Description
     */
    public interface UserMapper {
        /**
         * 一个参数的情况
         * @param id
         * @return
         */
        List<User> queryList(Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 定义Mapper映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
     
        <!-- 编写查询SQL语句 -->
        <select id="queryList" resultType="cn.js.domain.User"
            parameterType="java.lang.Integer">
            select * from user
            where id = #{abc}
        </select>
     
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    上面定义了一个参数的接口方法,可以看到接口方法中的参数名称叫做:id,而在XML映射文件里面则是使用【#{abc}】来获取的参数,MyBatis对于只有一个参数的时候,是支持这种写法的。

    在这里插入图片描述

    1.2、多个参数

    当接口方法需要传递多个参数的时候,这个时候XML映射文件里面,参数名称就不能任意编写了,那要如何获取到具体某个参数值呢???MyBatis框架支持下面三种方式进行参数绑定:

    三种参数获取方式:

    • 第一种方式:通过【arg0】【arg1】等等参数名称来获取参数值。
    • 第二种方式:通过【param0】【param1】等参数名称来获取参数值。
    • 第三种方式:通过@Param注解获取指定参数名称的对应关系。

    (1)arg和param获取参数

    MyBatis对于多个参数的情况下,框架会默认按照接口方法中参数的顺序,依次将这些参数保存到一个map集合里面,而这个map集合是以【arg】或者【param】两个作为key的,对应的value就是具体的参数值。

    举例如下:

    • 接口方法中有两个参数时候,这个时候MyBatis会将参数保存到map集合里面。
    • 【map.put(“arg0”, “参数1”);】或者【map.put(“param0”, “参数1”);】
    • 【map.put(“arg1”, “参数2”);】或者【map.put(“param1”, “参数2”);】
    • 多个参数依次类推,【map.put(“argn”, “参数n”);】或者【map.put(“paramn”, “参数n”);】。

    按照上面的规则,我们只需要在XML映射文件里面,通过对应的参数key就可以获取到对应的参数值。

    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2029/8/6 13:14
     * @Description
     */
    public interface UserMapper {
        /**
         * 多个参数情况
         * @param id
         * @param username
         * @return
         */
        List<User> queryList2(Integer id, String username);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 定义的XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList2" resultType="cn.js.domain.User">
            select * from user
            where id = #{arg0}
              and username = #{param2}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    【arg】和【param】可以混合使用,这两种获取参数的方式都是MyBatis支持的。

    在这里插入图片描述

    (2)@Param注解获取参数

    通过上面方式获取参数来看,太不方便了,我们还需要确保【arg】和【param】对应哪个参数,如果不小心对应错了,不容易发现问题所在,为了解决这个问题,MyBatis提供了@Param注解,@Param注解的作用就是将接口方法参数和XML映射文件中的参数进行关系映射。

    package cn.js.mapper;
     
    import cn.js.domain.User;
    import org.apache.ibatis.annotations.Param;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/7 14:14
     * @Description
     */
    public interface UserMapper {
     
        /**
         * 多个参数的情况
         * @param id
         * @param username
         * @return
         */
        List<User> queryList3(@Param("id") Integer id, @Param("uname") String username);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 定义XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList3" resultType="cn.js.domain.User">
            select * from user
            where id = #{id}
              and username = #{uname}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    上面这种方式是实际开发里面最常用的,因为这种方式更加的直观,参数绑定关系一目了然。

    在这里插入图片描述

    1.3、Map类型参数

    MyBatis框架对于多个参数的时候,是采用Map集合来保存的,那么我们就可以自己定义Map集合作为参数,使用的时候也是直接通过key获取对应的参数值即可。

    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
    import java.util.Map;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/9 10:12
     * @Description
     */
    public interface UserMapper {
        /**
         * Map集合参数
         * @param map
         * @return
         */
        List<User> queryList4(Map<String, String> map);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • Mapper映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList4" resultType="cn.js.domain.User">
            select * from user
            where id = #{id}
              and username = #{uname}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.4、JavaBean类型参数

    MyBatis对于JavaBean类型的参数,它在进行参数绑定的时候,是根据对应的【getter】方法来获取参数值的,也就是说,XML映射文件里面的参数名称,必须是在JavaBean实体类里面具有【getXXX()】方法的,这样才能够进行参数绑定。

    package cn.js.mapper;
     
    import cn.js.User;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/8 09:14
     * @Description
     */
    public interface UserMapper {
        /**
         * 实体类参数
         * @param user
         * @return
         */
        List<User> queryList5(User user);
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 创建XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList5" resultType="cn.js.domain.User">
            select * from user
            where id = #{id}
              and username = #{username}
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    实体类参数绑定规则如下所示:

    在这里插入图片描述

    1.5、List集合类型

    集合类型的参数,在实际开发里面,使用最多的场景就是【IN】条件查询,批量插入、批量更新的操作。

    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/8 17:21
     * @Description
     */
    public interface UserMapper {
        /**
         * 集合类型参数
         * @param ids
         * @return
         */
        List<User> queryList6(List<String> ids);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 创建XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList6" resultType="cn.js.domain.User">
            select * from user
            where id in
            <foreach collection="list" open="(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    MyBatis对于集合类型的参数,如果没有使用@Param注解明确指定参数名称,那么MyBatis框架会默认采用**【arg0,list、collection】**三个参数名称进行映射,所以我们在使用的参数的时候,不能使用接口方法参数名称,只能够使用【arg0,list、collection】这三个参数名称。

    <!-- 使用 collection 参数名称 -->
    <foreach collection="collection" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
     
    <!-- 使用 arg0 参数名称 -->
    <foreach collection="arg0" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
     
    <!-- 使用 list 参数名称 -->
    <foreach collection="list" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    当然,如果我们通过@Param注解指定了具体的参数名称,那就直接使用具体的参数名称就好啦。

    1.6、Set集合类型参数

    对于Set集合参数类型来说,它其实和List集合是类似的,只不过Set集合在没有指定具体参数名称的时候,MyBatis框架默认提供了**【arg0,collection】**两个参数名称,相比于List集合,Set集合缺少一个参数名称。

    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
    import java.util.Set;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2023/9/8 17:30
     * @Description
     */
    public interface UserMapper {
        /**
         * 集合参数类型
         * @param ids
         * @return
         */
        List<User> queryList7(Set<String> ids);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 创建XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList7" resultType="cn.js.domain.User">
            select * from user
            where id in
            <foreach collection="arg0" open="(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Set集合类型参数只提供了两种默认的参数名称可供选择。

    <!-- 使用 collection 参数名称 -->
    <foreach collection="collection" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
     
    <!-- 使用 arg0 参数名称 -->
    <foreach collection="arg0" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.7、数组类型参数

    对于数组类型的参数,MyBatis默认提供了两种参数名称可供选择,分别是:【arg0,array】

    package cn.js.mapper;
     
    import cn.js.domain.User;
     
    import java.util.List;
     
    /**
     * @author js
     * @version 1.0.0
     * @Date: 2022/9/7 10:26
     * @Description
     */
    public interface UserMapper {
        /**
         * 数组类型参数
         * @param ids
         * @return
         */
        List<User> queryList8(int[] ids);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 定义XML映射文件。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.js.mapper.UserMapper">
        <!-- 编写查询SQL语句 -->
        <select id="queryList8" resultType="cn.js.domain.User">
            select * from user
            where id in
            <foreach collection="ids" open="(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </select>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注意:以上这些类型参数,MyBatis都默认提供了一些参数名称,例如:arg0,param0,list、array、collection等。

    但是,在实际开发中,都是会通过@Param注解来指定具体的参数名称,因为这样更加的直观清晰。

  • 相关阅读:
    JAVA8时间工具类
    物联网主机:为智能交通赋能
    深入理解 Java 对象的内存布局
    第二章:ShardingSphere简介
    LeetCode_7_5
    Docker安装MongoDB和Redis
    Hafnium之S-EL0分区支持
    Overleaf(Latex)论文里插入高清matlab图像,亲测有效!!
    《014.SpringBoot+vue之学生选课管理系统03》【前后端分离】
    服务端挂了,客户端的 TCP 连接还在吗?
  • 原文地址:https://blog.csdn.net/qq_45525848/article/details/132784248