Mybatis - QueryBuilder 类中的参数映射

我很习惯使用 mybatis 作为 ORM 工具。但是我无法理解参数映射在 mybatis 中是如何工作的。


假设我定义了一个 mybatis 映射器接口,该接口具有获取用户详细信息的方法。


我定义了我的Querybuilder 类,它有 select query。


public interface UserMapper {


    @SelectProvider(type = UserQueryBuilder.class, method = "getUserId")

    Long getUserId(@Param("first") String firstName, @Param("last") String lastName, @Param("location") String location);


}



public class UserQueryBuilder(){


    public String getUserId(String firstName, String lastName, String location) {

        return new SQL() {{

            SELECT("USER_TABLE.USER_ID");

            FROM("USER_TABLE");

            WHERE("USER_TABLE.FIRST_NAME" + " = #{first}");

            WHERE("USER_TABLE.LAST_NAME" + " = #{last}");

            WHERE("USER_TABLE.LOCATION" + " = #{location}");


        }}.toString();

    }


}

在上面提到QueryBuilder的SQL 查询参数如何能够映射到“第一个”和“最后一个”参数值,在“userMapper”接口中定义。


慕后森
浏览 335回答 2
2回答

波斯汪

MyBatis像Spring AOP Proxy一样为mapper构建了一个动态代理,因为MyBatis是使用MapperProxyFactory来创建代理实例MapperProxy和代理接口()。 UserMapper因此,当调用getUserId,MapperProxy将通过以下方式捕获目标方法和参数:public Object invoke(Object proxy, Method method, Object[] args) throws Throwable这将调用对应MapperMethod执行SQL与转换后的参数传递给参数由:Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param);因为method.convertArgsToSqlCommandParam实际上会通过@Param注释生成命名参数。同时还需要替换占位符(#{first})来询问,并与对应的参数,在此之后它会创建BoundSql所有拥有原始的SQL和参数,这些都将交给JDBC的dirver执行就像我们使用的JdbcTemplate直接。sqlSourceParser.parse(replacePlaceholder(sql), parameterType, new HashMap());

摇曳的蔷薇

重要的是UserQueryBuilder没有获取UserMapper接口中定义的参数。有几个组件参与查询执行:映射器的客户端映射器接口查询生成器spring-mybatis 库mybatis 库映射器接口的目的是:指定将使用的查询指定查询需要的参数定义实际的java接口Mapper 可以直接使用注释来定义查询,例如@Select,隐式使用 xml 映射中定义的查询或通过 使用查询构建器@SelectProvider。builder 的目的与 of@Select或 xml 映射相同,即provide the query textto mapper。映射器的实际实现由spring-mybatis. 该实现是基于映射器类动态创建的。实现是这样工作的:当映射器上的方法被调用时,它使用反射来调用 mybatis 上的适当方法(如selectOne或selectList基于映射器方法中定义的返回类型)SqlSession。为此,它需要查询文本和参数。查询文本取自 builder/annotation/xml。参数可用作映射器方法调用的参数。然后SqlSessoin本身使用查询和参数来使用 JDBC API 执行查询。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java