zoukankan      html  css  js  c++  java
  • MyBatis多个接口参数报错:Available parameters are [0, 1, param1, param2], 及解决方法

    1. sql语句如下: 

          SELECT * FROM tb_crm_user WHERE
    id = #{userId, jdbcType=INTEGER} AND
    user_name = #{userName, jdbcType=VARCHAR}

    2. 接口如下:

    TbCrmUser queryTbCrmUser(int userId, String userName);

    3. 调用接口方式如下:

    int userId = 1000059081;
    String userName = "积极";
    TbCrmUser user1 = tb.queryTbCrmUser(userId, userName); 


    4. 结果如下:

    5. 错误原因:

    这个错误表示,xml可用的参数只有【0, 1, param1, param2】四个,没有userId! 这就奇了个怪,本宝明明给了参数userId,为什么识别不了?而且我只有一个参数的时候,这样明明没有错呀!!!

    原来是【0, 1, param1, param2】是MyBatis根据参数位置自定义的名字,如果只有一个参数,那就只有一个位置,当然没有歧义了。可是如果有多个参数,就需要指定哪个参数在哪个位置!

    6. 修改方式1:

        最简单的一个方式就是修改sql语句,指定位置,用0,1 或者param1, param2都可以:

    SELECT * FROM tb_crm_user WHERE
    id = #{0, jdbcType=INTEGER} AND
    user_name = #{1, jdbcType=VARCHAR}
    但是不建议这样做,因为如果参数很多,效果则不理想;

    修改方式2:
    给接口添加@Param注解,指明参数的对应关系,原因是给参数配置了@Param注解后,MyBatis就会自动将参数封装成Map类型,@Param注解值会作为Map中的key,因此在xml中的sql语句就可以通过配置的注解值来使用参数
    TbCrmUser queryTbCrmUser(@Param("userId") int userId,
    @Param("userName") String userName);
    修改方式3:
    当参数很多时:我们还可以采用如下方式解决:
    首先,修改接口参数格式:
    TbCrmUser queryTbCrmUser(Map<String, Object> map);

    其次,在调用接口的前面自己创建一个map
    int userId = 1000059081;
    String userName = "积极";
    Map<String, Object> map = new HashMap<>();
    map.put("userId", userId);
    map.put("userName", userName);
    TbCrmUser user1 = tb.queryTbCrmUser(map);
    这样做的本质与第二种方式本质一致!




  • 相关阅读:
    win10 彻底删除mysql步骤
    IDEA中添加类的创建者信息
    针对标签中设置 disabled="true",$("#id").serialize()获取不到value的解决方法
    使用Vue-cli创建project遇到的坑
    Jmeter压测总结
    Java通过ssh远程连接服务器
    Django 学习笔记(一)
    Python 测试框架基础
    Python 基础&Excel操作
    Appium环境搭建及计算器小实验
  • 原文地址:https://www.cnblogs.com/leavescy/p/7641514.html
Copyright © 2011-2022 走看看