繁体   English   中英

Mybatis-QueryBuilder类中的参数映射

[英]Mybatis - parameter mapping in QueryBuilder class

我将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”接口中定义的“第一个”和“最后一个”参数值。

重要的是, UserQueryBuilder不会获取UserMapper接口中定义的参数。

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

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

映射器界面的目的是:

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

映射器可以直接使用@Select注释来定义查询,也可以隐式使用xml映射中定义的查询或通过@SelectProvider使用查询生成器来定义查询。 构建器的目的与@Select或xml映射的目的相同,即将provide the query text给mapper。

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

MyBatis为诸如Spring AOP Proxy之类的映射器构建一个动态代理 ,因为MyBatis使用MapperProxyFactory创建具有代理接口UserMapper )的代理实例 MapperProxy

因此,当调用getUserIdMapperProxy将通过以下方式捕获目标方法参数

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM