2012-01-18 17 views
4

私は理解しようとしているコードを継承しています。何かを探すために何かを探すのは@SelectProviderです。@SelectProviderのmybatisパラメータの置換はどのように機能しますか

Javaの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}の項目の2つの方法でパラメータを受け取ります(例では)。 select文で使用される前にparentIdがチェックされていることを示すコードです。 #{parentId}を照会できないため、parentId変数が必要です。

Btw、これはSelectProvidersの最適な実装ではなく、最後にSELECT()、WHERE()およびSQL()を使用してコンパイル済みの文を返すことになっています。私はあなたの例もうまくいくと思います。

+0

私はあなたが言っていることを理解しています...私が尋ねた行は何もしていないということを読んでいる人を指摘したいだけです。 parentIdの値を取得しますが、何もしません。このコードでは、このコード行は意味がありません。 – kasdega

関連する問題