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();
    }

}

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

chengpohi

MyBatisSpring 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直接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章