mybatis的mapper,参数为map的话,为啥报这个错?

java.lang.IllegalArgumentException: Name for argument type [int] not available, and parameter name information not found in class file either.

 <select id="get_cases" resultType="News" parameterType="java.util.Map">

SELECT * FROM `case` WHERE state=0 and `type`= #{type,jdbcType=INTEGER}

order by create_time desc limit ${num,jdbcType=INTEGER}

</select>

图片描述

回答:

既然是map,那么入参应该是一个对象,type是map中的一个属性的话,这个位置应该是

 <select id="get_cases" resultType="News" parameterType="java.util.Map">

SELECT * FROM `case` WHERE state=0 and `type`= #{map.type,jdbcType=INTEGER}

order by create_time desc limit ${map.num,jdbcType=INTEGER}

</select>

另外,建议使用@Param注解将参数命名。

回答:

XML那里写错了,更正成parameterType="map",并不是java.util.Map

扩展阅读:

在mapper中如何传递多个参数?

第一种:使用占位符的思想

  • 在映射文件中使用#{0},#{1}代表传递进来的第几个参数
  • 使用@param注解:来命名参数

#{0},#{1}方式

//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">

select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1}

</select>

@param注解方式

public interface usermapper {

user selectuser(@param(“username”) string username,

@param(“hashedpassword”) string hashedpassword);

}

 <select id=”selectuser” resulttype=”user”> 

select id, username, hashedpassword

from some_table

where username = #{username}

and hashedpassword = #{hashedpassword}

</select>

第二种:使用Map集合作为参数来装载

try{

//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL

/**

* 由于我们的参数超过了两个,而方法中只有一个Object参数收集

* 因此我们使用Map集合来装载我们的参数

*/

Map<String, Object> map = new HashMap();

map.put("start", start);

map.put("end", end);

return sqlSession.selectList("StudentID.pagination", map);

}catch(Exception e){

e.printStackTrace();

sqlSession.rollback();

throw e;

}finally{

MybatisUtil.closeSqlSession();

}

<!--分页查询-->

<select id="pagination" parameterType="map" resultMap="studentMap">

/*根据key自动找到对应Map集合的value*/

select * from students limit #{start},#{end};

</select>

以上是 mybatis的mapper,参数为map的话,为啥报这个错? 的全部内容, 来源链接: utcz.com/p/177826.html

回到顶部