mybatis参数替换如何在@SelectProvider中工作

我inheritance了一些我想要理解的代码,而我在@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 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} "); } // ...