关于ibatis.binding.BindingException: Parameter ‘frame‘ not found异常

情况1

Dao层代码写法:

Entity getEntityList(String params1,Integer params2, Integer params3,Integer params4);

对应SQL:

SELECT * FROM table t WHERE t.age = #{params1} AND t.age = #{params1} AND t.age = #{params1} AND t.age = #{params1}

场景:windows环境下无异常,而Linux环境下会抛出异常

nested exception is org.apache.ibatis.binding.BindingException: Parameter 'params1' not found. Available parameters are [arg3, arg2, arg1, arg0, param3, param4, param1, param2]

情况2

Dao层代码写法:

Entity getEntityList(String params1);

对应SQL:

SELECT * FROM table t WHERE t.age = #{params1} 

场景:windows环境下无异常,Linux环境下也无异常

总结:

      经过查阅资料,做一下总结

           1、如果传参数的时候以Map<String,Object> params方式进行传参时,sql中取参数是根据key去取参数

           2、如果传参数时,不使用Map<String,Object> params进行封装,而是有多少数据,dao层接口的括号里写多少数据,mybatis就会将接口的数据解析成

void method(Integer params1,Integer params2,Integer params3)

     sql中就会处理成

SELECT * FROM table t WHERE t.age = #{params1} AND  t.age = #{params2}  AND  t.age = #{params3} -- 这种windows和Linux不会报错
SELECT * FROM table t WHERE t.age = #{params3} AND  t.age = #{params2}  AND  t.age = #{params1} -- 这种windows下不会报错,Linux下回报错

由此总结:1、如果dao层参数是一个的话,可以不加@Param注解,正常写即可

                  2、如果dao层参数是多个的话,有两种写法

                      (1)dao层参数加上@Param注解,且传入参数的顺序,不需要跟SQL中使用的顺序一致,SQL中正常使用即可

                      (2)dao层参数不加@Param注解,这时候,传入参数的顺序必须和SQL中使用参数的顺序保持一致才行

查阅资料:https://www.cnblogs.com/canger/p/9931774.html

猜你喜欢

转载自blog.csdn.net/Tom_sensen/article/details/111563886