Mybatis-QueryBuilder类中的参数映射

时间:2018-08-22 06:15:05

标签: java spring-mvc spring-boot mybatis spring-mybatis

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

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

我定义了我的Querybuilder ,其中有选择的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'中定义的“第一”和“最后”参数值界面

2 个答案:

答案 0 :(得分:1)

重要的是UserQueryBuilder不会获得UserMapper界面中定义的参数。

有几个参与查询执行的组件:

  1. 映射器的客户端
  2. 映射器界面
  3. 查询生成器
  4. spring-mybatis库
  5. mybatis库

映射器界面的目的是:

  1. 指定要使用的查询
  2. 指定查询所需的参数
  3. 定义实际的Java接口

映射程序可以直接使用诸如@Select之类的注释来定义查询,也可以隐式使用xml映射中定义的查询或通过@SelectProvider使用查询构建器。构建器的用途与@Select或xml映射相同,即到provide the query text到映射器。

spring-mybatis提供了映射器的实际实现。该实现是根据mapper类动态创建的。该实现的工作方式是这样的:调用映射器上的方法时,它会在mybatis {{1上使用反射来调用适当的方法(例如selectOneselectList(基于映射器方法中定义的返回类型)) }}。为此,它需要查询文本和参数。查询文本来自builder / annotation / xml。参数可用作映射器方法调用的参数。然后SqlSession本身使用查询和参数来使用JDBC API执行查询。

答案 1 :(得分:0)

MyBatis 映射器(如dynamic proxy)构建Spring AOP Proxy,因为 MyBatis 正在使用MapperProxyFactory使用代理接口UserMapper)创建代理实例 MapperProxy

因此,在调用getUserId时,MapperProxy将通过以下方式捕获目标方法参数

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

这将调用对应的MapperMethod来执行 sql ,其中将args转换为参数,方法是:

Object param = method.convertArgsToSqlCommandParam(args);
result = sqlSession.selectOne(command.getName(), param);

由于method.convertArgsToSqlCommandParam实际上将通过 @Param 注释生成命名参数

,并且还需要将占位符#{first})替换为询问并使用相应的参数,此后,它将创建拥有以下内容的BoundSql 原始sql 参数,它们将移交给 jdbc驱动程序来执行,就像我们直接使用 jdbcTemplate 一样。