mybatis 传递参数的9种方法

<?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="com.mapper.UserMapper">
    <!--
        第一种方式:使用顺序传递参数
        XxxController:
            @ApiOperation(value = "多个参数查询_匿名顺序传参")
            @GetMapping("find1")
            public ResultMsg find1(String name,String age)
            {
                List result= UserMapper.getUserByNameAndAge(gender,age);
                return ResultMsg.getMsg(result);
            }
        XxxMapper.java:
            List<User> getUserByNameAndAge(String name, int age);
    -->
    <select id="getUserByNameAndAge" resultType="com.pojo.User">
        select * from user where name=#{param1} and age=#{param2}
    </select>

    <!--
        第二种方式:使用@Param注解,使用@Param注解显示的告诉mybatis参数的名字,这样在xml中就可以按照参数名去引用了
        XxxController:
            @ApiOperation(value = "多个参数查询_匿名顺序传参")
            @GetMapping("find2")
            public ResultMsg find2(String name,String age)
            {
                List result= UserMapper.getUserByNameAndAge2(gender,age);
                return ResultMsg.getMsg(result);
            }
        XxxMapper.java:
            List<User> getUserByNameAndAge2(@Param("name") String name, @Param("age") int age);
    -->
    <select id="getUserByNameAndAge2" resultType="com.pojo.User">
        select * from user where name=#{name} and age=#{age}
    </select>

    <!--
        第三种方式:使用Map传递参数,可以看到使用map来传递多个参数,可以直接使用参数的key进行引用。
        XxxController:
            @ApiOperation(value = "多个参数查询_匿名顺序传参")
            @GetMapping("find3")
            public ResultMsg find3(String name,String age)
            {
                 Map map = new HashMap<>();
                 params.put("name",name);
                 params.put("age",age);
                 List result= UserMapper.getUserByNameAndAge3(map);
                 return ResultMsg.getMsg(result);
            }
        XxxMapper.java:
            List<User> getUserByNameAndAge3(Map params);
    -->
    <select id="getUserByNameAndAge3" resultType="com.pojo.User">
        select * from user where name=#{name} and age=#{age}
    </select>

    <!--
        第四种方式:用java bean传递多个参数。
                  也可以使用bean的方式来传递多个参数,使用时parameterType指定为对应的bean类型即可。
                  这就传参方式的优点是比较方便,controller层使用@RequestBody接收到实体类参数后,直接传递给mapper层调用即可,不需要在进行参数的转换。
                  参数的引用直接使用bean的字段。
        postMan:
                {
                    "name":"zhangsan",
                    "age":"23"
                }
        XxxController:
            @ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
            @PostMapping("find4")
            public ResultMsg find4(@RequestBody User user)
            {
                List result= userMapper.getUserByUser4(user);
                return ResultMsg.getMsg(result);
            }
        XxxMapper.java:
            List<User> getUserByUser4(User user);
        自测(XxxController.java中):
            //  或硬编码:写死实体类
            //  User user = new User();
            //  user.setName("222");
            //  user.setAge(2);
    -->
    <select id="getUserByNameAndAge4" resultType="com.pojo.User">
        select * from user where name=#{name} and age=#{age}
    </select>


    <!--
        第五种方式:直接使用JSON传递参数,这也是推荐的一种传参方式,controller层收到JSON型数据后,直接传递给mapper层进行查询操作,简单 方便
        postMan:
                {
                    "name":"zhangsan",
                    "age":"23"
                }
        Controller.java
                @ApiOperation(value = "多个参数查询_通过JSON传递多个参数")
                @PostMapping("find5")
                public ResultMsg find5(@RequestBody JSONObject params)
                {
                    List result= userMapper.getUserByNameAndAge5(params);
                    return ResultMsg.getMsg(result);
                }
        XxxMapper.java:
                List <User> getUserByNameAndAge5(JSONObject params);
        自测(XxxController.java中):json
                JSONObject object = new JSONObject();
                object.put("name","333");
                object.put("age","3");
    -->
    <select id="getUserByNameAndAge5" resultType="com.pojo.User" parameterType="com.alibaba.fastjson.JSONObject">
        select * from user where name=#{name} and age=#{age}
    </select>

    <!--
        第六种方式:传递集合类型参数List、Set、Array:在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递:
                  这里foreach表示循环操作,具体的参数含义如下:
                  foreach元素的属性主要有 item,index,collection,open,separator,close。
                    (1)item表示集合中每一个元素进行迭代时的别名,
                    (2)index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
                    (3)open表示该语句以什么开始,
                    (4)separator表示在每次进行迭代之间以什么符号作为分隔符,
                    (5)close表示以什么结束
                  在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
                    (1)如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
                    (2)如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
                    (3)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map或者Object
        postMan:
                ["24","25"]
        Controller.java
                @ApiOperation(value = "多个参数查询_通过List、Set、Array传递多个参数")
                @PostMapping("find6")
                public ResultMsg find6(@RequestBody List<String> list)
                {
                    List result= userMapper.findUserList6 (list);
                    return ResultMsg.getMsg(result);
                }
        XxxMapper.java:
                List <User> findUserList6(List list);
        自测(XxxController.java中):List集合
                User u1 = new User("Jone");
                User u2 = new User("Billie");
                List<User> list = new ArrayList();
                list.add(u1);
                list.add(u2);
    -->
    <select id="findUserList6" resultType="com.pojo.User">
        SELECT * from user where age in
        <foreach collection="list" open="(" separator="," close=")" item="user">
            #{user.name}
        </foreach>
    </select>

    <!--
        第七种方式:参数类型为对象+集合:该类参数与java Bean参数形式类似,只不过更复杂一些,如下面的User类,除了基本字段还包括一个Course的列表bean。
                  这里foreach 对应User中的List Course。
        实体类(表)设计:
                    @Data
                    public class User {
                        private Integer id;
                        private String name;
                        private Integer age;
                        private String email;
                        private Integer sex;
                        private List<Course> courseList;
                    }
                    @Data
                    public class Course {
                        private String coursename;
                        private String teacher;
                        private Integer userid;
                    }
        postman:请求
                    {
                        "id":"3",
                        "email":"[email protected]",
                        "courseList":[
                            {
                                "teacher":"jt"
                            },
                            {
                                 "teacher":"ct"
                            }
                        ]

                    }
        XxxController.java
                    @ApiOperation(value = "多个参数查询_对象+集合参数")
                    @PostMapping("find7")
                    public ResultMsg find7(@RequestBody User user)
                    {
                        List result= userMapper.findUserList7(user);
                        return ResultMsg.getMsg(result);
                    }

        XxxMapper.xml
            List <User> findUserList7(@Param("user")User user);
        ==>附:返回json
                    ==>  Preparing: SELECT * from course where userid =? and teacher in ( ? , ? )
                    ==>  Parameters: 3(Integer), jt(String), ct(String)
                    ==>  Columns: id, coursename, teacher, userid
                    ==>  Row: 1, java, jt, 3
                    ==>  Row: 2, C, ct, 3
                    ==>  Total: 2
              {
                  "data": [
                    {
                      "coursename": "北新街ndcpc",
                      "teacher": "kls0bx19cy"
                    },
                    {
                      "coursename": "北新街lavi0",
                      "teacher": "gj9q3ygikh"
                    }
                  ],
                  "result": "SUCCESS",
                  "resultCode": 200,
                  "resultMsg": ""
             }
    -->
    <select id="findUserList7" resultType="com.pojo.User">
        SELECT * from course where userid =#{user.id} and teacher in
        <foreach collection="user.courseList" open="(" separator="," close=")" item="course">
            #{course.teacher}
        </foreach>
    </select>
</mapper>

参考:

        ( 这里还有2种 ) MyBatis - 传递参数 7 种方式_放羊的牧码的博客-CSDN博客_mybatis传值方式

        mybatis 传递参数的7种方法 - 苍青浪 - 博客园 (cnblogs.com)

        mybatis 传递参数的7种方法-蒲公英云 (dandelioncloud.cn)

猜你喜欢

转载自blog.csdn.net/aiwokache/article/details/129110992