Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 573|回复: 0

MyBatis多个接口参数报错:Available parameters are [0, 1, param1, param2], 及解决方法

[复制链接]
  • TA的每日心情
    奋斗
    昨天 16:00
  • 签到天数: 755 天

    [LV.10]以坛为家III

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    707348
    发表于 2021-4-26 16:07:49 | 显示全部楼层 |阅读模式

     

    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);
    这样做的本质与第二种方式本质一致!


     



    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-27 03:36 , Processed in 0.063958 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表