今天在使用 Mybatis 查询表数据时候,出现了错误,我回头看了一下。明明 sql 语句和标签之类的使用的都是正确的,但是无法通过条件查询到相关数据。
接口代码:
//测试 动态 Sql 语句,用动态 sql 和 where 标签查找学生
public List<User> selectUsers(Integer id,String name);
映射:
<sql id="USER_SELECT">
select * from
</sql>
<select id="selectUsers" resultType="com.qfedu.wzs.www.pojo.User">
<include refid="USER_SELECT" />
t_users
<where>
<if test="id != null and id != '' ">
and id = #{id}
</if>
<if test="name != null and name != '' ">
and name = #{name}
</if>
</where>
</select>
测试:
@Test
public void selectUsers() {
MybatisUtil.getMapper(UserMapper.class)
.selectUsers(null,"小郭").forEach(System.out::println);
}
报错:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
由报错可以看出:它提示我们需要传入两个参数,但是 id 接收不到,(跟 null 没有关系,条件中我们进行了判断,而且我也试过了传入 not null 的值,依然是一样的错误)。
经过尝试以后发现使用 @Param 注解后就可以正常查询了
代码:
//测试 动态 Sql 语句,用动态 sql 和 where 标签查找学生
public List<User> selectUsers(@Param("id")Integer id,@Param("name")String name);
后来看另一个博主的文章(原文链接:https://blog.csdn.net/Hpeacheng/article/details/121582242)才知道,当mybatis传入多个参数时(一般2-5)个,是需要用@Param来定义我们的参数的,因为Mybatis只会识别一个参数,并且匹配,但是当我们传入多个参数的时候,mybatis就分不开了,这时候有两种方法,一个是使用Map,这个需要在xml配置的情况下使用,但是一般我们表面上看不到具体传的是什么参数,可读性较差。