2012-01-18 1 views
4

이해하려고하는 일부 코드를 상속 받았으며 @SelectProvider에서 찾은 결과가 전혀 없습니다.@SelectProvider에서 mybatis 매개 변수 대체가 작동하는 방법

자바 DAO

@SelectProvider(type = CategoryDaoSelectProvider.class, method = "findByParentIdAndName") 
Category findByParentIdAndName(@Param("parentId") Long parentId, @Param("name") String name); 

공급자 선택

public class CategoryDaoSelectProvider { 
    public static String findByParentIdAndName(Map<String, Object> params) { 
     Long parentId = (Long)params.get("parentId"); // WHY IS THIS HERE??? 

     StringBuffer buffer = new StringBuffer(); 
     buffer.append("SELECT COUNT(id) FROM Category "); 

     if (parentId == null) { 
      buffer.append("WHERE parentId IS NULL "); 
     } else { 
      buffer.append("WHERE parentId = #{parentId} "); 
     } 

     buffer.append("AND LOWER(name) = LOWER(#{name}) "); 

     return buffer.toString(); 
    } 
} 

경우 PARAM parentId이 코드에서 어떤 목적에 봉사 하는가? # {parentId}가 마술처럼 바뀌지 않는 한 실제로는 아무 것도하지 않습니다. 이 매개 변수는이 상황에서 사용되지 않습니까? mybatis은 실제로 쿼리에 주입을 수행합니까?

답변

5

SelectProviders는 params Map 인수의 항목과 # {parentId} (예제)의 두 가지 방법으로 매개 변수를받습니다. 코드는 select 문에서 사용되기 전에 parentId가 검사되는 것을 보여줍니다. # {parentId}를 쿼리 할 수 ​​없으므로 parentId 변수가 필요합니다.

Btw, 이것은 SelectProviders의 최상의 구현이 아니므로 SELECT(), WHERE() 및 SQL()을 마지막에 사용하여 컴파일 된 명령문을 반환해야합니다. 나는 당신의 모범이 너무 효과가 있다고 생각합니다.

+0

나는 당신이 말하는 것을 이해하고 있습니다 ... 제가 물어 본 라인이 아무 것도하지 않는다는 것을 읽는 누군가를 지적하고 싶습니다. 우리는 parentId에 대한 값을 얻지 만 아무것도하지 않습니다. 이 코드에서이 코드 라인은 아무런 도움이되지 않습니다. – kasdega