簡體   English   中英

mybatis參數替換如何在@SelectProvider中工作

[英]How does the mybatis parameter replacement work in @SelectProvider

我繼承了一些我想要理解的代碼,而且我在@SelectProvider上找到的任何搜索都發現了很多東西。

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在哪里實際注入查詢?

SelectProviders以兩種方式接收參數:作為params Map參數中的項目和#{parentId}(在您的示例中)。 您的代碼顯示parentId在select語句中使用之前被檢查。 需要parentId變量,因為您無法查詢#{parentId}。

順便說一句,這不是SelectProviders的最佳實現,你應該在結尾使用SELECT(),WHERE()和SQL()來返回編譯語句。 我猜你的例子也有效。

您可以按如下方式重寫該段代碼,這可能更清楚一點? parentId的實際值確實不是必需的,但是需要關於參數是否存在的信息。

 // ...
 boolean hasIdParam = params.containsKey("parentId");

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM