본문 바로가기
error...

MyBatis) org.apache.ibatis.binding.BindingException:Parameter 'count' not found. Available parameters are [arg1, arg0, param1, param2] - @Param 을 써라..

by 어렵다어려웡 2021. 3. 20.

 

MyBatis를 이용한 SQL Mapper는 불러오는 메서드당 하나의 파라미터를 읽는다..

 

이게 무슨 의미인가 하면

 

// ClothesMapper..

	//추가
	public Long insert(ClothesVO vo);
	//상세(목록)
	public ClothesVO read(Long cno);
	//수정
	public boolean update(ClothesVO vo);
	//삭제
	public boolean delete(Long cno);
	//전체 목록
	public List<ClothesVO> getList(Criteria cri);
	// 조회수 증가 및 감소
	public void updateViewCnt(@Param("cno")Long cno, @Param("count")int count);
	
	public int getTotal(Criteria cri);
	// 마지막번호
	public Long getLastCno();

최근에 작업하는 프로젝트 내의 interface의 코드를 발췌했습니다.

MyBatis를 사용해서 SQL을 만들고 해당 메서드를 이용하도록 설정이 되어 있습니다.

 

// ClothesMapper.xml
	//추가 SQL
	<insert id="insert"
		parameterType="com.cs.domain.category.ClothesVO">
		insert into tbl_clothes ( productName, description, writer, price, count )
		values ( #{productName}, #{description}, #{writer}, #{price} ,#{count} )
	</insert>
    
	// 조회수 증가 SQL
	<update id="updateViewCnt">
		update tbl_clothes
		set viewCnt = viewCnt + #{count}
		where cno = #{cno}
	</update>

insert 같은 경우 ClothesVO를 통해서 여러개의 객체를 하나의 VO로 바인딩 시키기 때문에

Mybatis가 해당 파라미터들을 알아서 읽지만.

 

updateViewCnt와 같이 조회수를 증가시키는 메서드의 경우

전혀 다른 정보를 받아오기 떄문에 Mybatis가 해당 객체가 어떤것인지 읽지 못하는 상황이 발생한다.

 

따라서 Mapper에 설정된 updateViewCnt의 매개변수에  @Param을 추가하여 

SQL을 읽을 떄 해당 데이터가 어떤 것인지를 명시해 줘야 에러가 없이 진행된다.

 

만약 아래와 같이 메서드를 만들고 실행하게 된다면

public void updateViewCnt(Long cno, int count);

org.apache.ibatis.binding.BindingException:

Parameter 'count' not found. Available parameters are [arg1, arg0, param1, param2]

 

위처럼 count가 무엇인지 찾을 수 없다고 에러가 발생한다.