• MyBatis 中传递多个参数的 4 种方式


    方式 1 :封装成对象入参  #{对应实体类的属性}

     //UserMapper.java 接口

     /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @param user 对象入参 * @return */ public List<User> getUserListByUserNameAndUserRole(User user);

    //UserMapper.xml SQL 映射文件
    <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表 (参数:对象入参); 参数传递:#{属性名}(参数对象中的属性名) --> <select id="getUserListByUserNameAndUserRole" resultType="user" parameterType="user"> SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{userName},'%') AND userRole=#{userRole} </select>

    //单元测试类 UserMapperTest.java
    @Test
    // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) public void testGetUserListByUserNameAndUserRole() { List<User> userList = null; User user = new User(); user.setUserName("孙"); user.setUserRole(3); userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(user); for (User u : userList) { System.out.println(u); } }

      说明:1、parameterType 使用了复杂数据类型,把条件参数封装成 User 对象进行入参。  2、#{属性名}里面的名称对应的是 User 实体类里面的成员属性。

    方式 2 :封装成 Map 对象入参  #{对应的是 Map 里面的 key 名称}

    //UserMapper.java 接口
       /**
         * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:Map 对象入参)
         * @param userMap Map 对象入参
         * @return
         */
        public List<User> getUserListByUserNameAndUserRole(Map<String, Object> userMap);

    //UserMapper.xml SQL 映射文件
    <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表  (参数:Map 对象入参); 参数传递:#{Map 的 key} -->
        <select id="getUserListByUserNameAndUserRole" resultType="user" parameterType="map">
            SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{uName},'%') AND userRole=#{uRole}
        </select>

    //单元测试类 UserMapperTest.java
        @Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:Map 对象入参)
        public void testGetUserListByUserNameAndUserRole() {
            List<User> userList = null;
    
            Map<String, Object> userMap=new HashMap<String, Object>();
            userMap.put("uName", "孙");
            userMap.put("uRole", 3);
            userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userMap);
            for (User u : userList) {
                System.out.println(u);
            }
        }

      说明:Map 传参比较灵活,不管什么类型参数,或者多少个参数,都可以吧它封装成 Map 数据结构进行入参,通过 Map 的 key 即可获取传入的值。

    方式 3 :使用 @Param 注解实现多参数入参   #{对应 @param 注解里面的值}

    //UserMapper.java 接口
       /**
         * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参)
         * @param userName 用户名称
         * @param userRole 用户角色
         * @return
         */
        public List<User> getUserListByUserNameAndUserRole(@Param("name")String userName,@Param("role")int userRole);
    
    //UserMapper.xml SQL 映射文件
    <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参); 参数传递:#{对应 @param 注解里面的值}-->
        <select id="getUserListByUserNameAndUserRole" resultType="user" >
            SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{name},'%') AND userRole=#{role}
        </select>
    
    //单元测试类 UserMapperTest.java
        @Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参)
        public void testGetUserListByUserNameAndUserRole() {
            List<User> userList = null;
            String userName="孙";
            int userRole=3;
            userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userName, userRole);
            for (User u : userList) {
                System.out.println(u);
            }
        }

      说明:

         1、使用 @param 注解直接实现多参数入参,代码可读性高,可以清晰地看出这个接口方法所需的参数是什么。   

         2、使用 @param 注解直接实现多参数入参,相当于将参数重命名为注解名称,在映射的 SQL 中需要使用 #{注解名称} 。

           3、在 MyBatis 中参数入参,何时需要封装成对象入参,何时又需要使用多参数入参(即 @param 注解入参)?

           答:一般情况下,超过 4 个以上的参数最好封装成对象入参(特别是在常规的增加和修改操作时,字段较多,封装成对象比较方便)。
            对于参数固定的业务方法,最好使用多参数入参,原因是这种方法比较灵活,代码的可读性高,可以清晰地看出接口方法中所需的参数是什么。并且对于固定的接口方法,参数一般是固定的,所以直接多参数入参即可,无须封装对象。
            需要注意的是,当参数为基础数据类型时,不管是多参数入参,还是单独的一个参数入参,都需要使用 @Param 注解来进行参数的传递。

        

    方式 4 :使用下标传参   #{对应传入参数的顺序,下标从 0 开始}

    //UserMapper.java 接口
      /**
         * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参)
         * @param userName 用户名称
         * @param userRole 用户角色
         * @return
         */
        public List<User> getUserListByUserNameAndUserRole(String userName,int userRole);

    //UserMapper.xml SQL 映射文件
    <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参); 参数传递:#{对应传入参数的顺序,下标从 0 开始}-->
        <select id="getUserListByUserNameAndUserRole" resultType="user" >
            SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{0},'%') AND userRole=#{1}
        </select>

    //单元测试类 UserMapperTest.java
        @Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参)
        public void testGetUserListByUserNameAndUserRole() {
            List<User> userList = null;
            String userName="孙";
            int userRole=3;
            userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userName, userRole);
            for (User u : userList) {
                System.out.println(u);
            }
        }

      说明:#{ }里面的数字代表你传入参数的顺序,下标从 0 开始。

  • 相关阅读:
    【转载】分析商品日均销量(DMS)对促销商品选择的意义
    日志备份和差异备份还原中的常见问题示例(转自&邹建)
    SQL Server 2000中的完整备份、差异备份操作
    数据库差异备份与增量备份的不同之处
    差异备份和还原操作方法(转)
    SQL备份(全)
    Microsoft SQL2000 错误代码 (@@error)
    图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别
    arm-none-linux-gnueabi-gcc command not found
    关于ST-Link的internal command error问题的解决方法
  • 原文地址:https://www.cnblogs.com/wxdestiny/p/9749494.html
Copyright © 2020-2023  润新知