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

kas*_*ega 4 java ibatis mybatis

我继承了一些我想要理解的代码,而我所做的任何搜索都会发现@SelectProvider很多东西.

Java DAO

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

选择提供商

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

param parentId在此代码中的用途是什么?据我所知,除非神奇地将#{parentId}替换为值,否则它实际上什么都不做.在这种情况下,这个参数是不是用过的?哪里mybatis实际上做注射到查询?

sli*_*oad 5

SelectProviders以两种方式接收参数:作为params Map参数中的项目和#{parentId}(在您的示例中).您的代码显示parentId在select语句中使用之前被检查.需要parentId变量,因为您无法查询#{parentId}.

顺便说一句,这不是SelectProviders的最佳实现,你应该在结尾使用SELECT(),WHERE()和SQL()来返回编译语句.我猜你的例子也有效.