<select id="selectAllUserByAgeIsAseOrDesc" resultType="mybatis.pojo.User">
select *
from t_user order by #{sortBy} ${sc};
</select>
List<User> selectAllUserByAgeIsAseOrDesc(String sortBy,String sc);
这里遇到一个问题
我想传入排序方式和根据什么字段来排序,运行时总说找不到sc这个字段
提示信息说【arg0 arg1 param1 param2】可以用,我把sc改为arg1,运行,
在一次报错说找不到sortBy了,怎么回事,传入一个参数的时侯就能找到??
在查阅资料后:
-
如果传入的参数是一个 Java Bean
- 那么 MyBatis 会使用反射获取该对象的所有 getter 方法,并将方法返回值作为 SQL 语句的参数。MyBatis 会根据参数名称和 getter 方法名进行匹配,如果存在匹配的 getter 方法,则将其返回值作为 SQL 参数;如果不存在匹配的 getter 方法,则抛出异常。
-
如果传入的参数不是一个 Java Bean, 并且参数数量是一个,
- 则直接将该参数作为 SQL 语句的参数。
- 此时,传入参数的名称与方法形参的名称不需要完全匹配,只需要满足以下规则之一即可:
1、当方法只有一个参数的时候:
传入参数的名称和方法形参的名称相同;
传入参数的名称为 “param”,方法只有一个参数,且该参数没有注解
2、如果方法存在多个参数,且没有使用 @Param 注解指定参数名称, 则 MyBatis 会给每个参数自动生成一个名称,名称的格式为 “param” + 参数序号(从 1 开始)。 在 XML 配置文件中,可以使用 “#{}” 占位符来表示方法参数。
- 此时,传入参数的名称与方法形参的名称不需要完全匹配,只需要满足以下规则之一即可:
- 则直接将该参数作为 SQL 语句的参数。
-
到这里疑问解决,
因为我传入的参数不是一个Javabean,没有对应的getter方法能调用。而且,我传入的参数不止一个,满足了不是Javabean
和参数数量大于一
这两个条件,- 那么mybatis底层就会自动为这两个参数生成名称 为【arg0 arg1 ……或者 param1 param2……】
然后还因为我传入的参数名称和底层给的不同,所以才会报错,
- 那么mybatis底层就会自动为这两个参数生成名称 为【arg0 arg1 ……或者 param1 param2……】
-
最后,
将传入的参数的名称改为arg0,arg1问题解决