[英]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
接口中定义的参数。
有几个参与查询执行的组件:
映射器界面的目的是:
映射器可以直接使用@Select
注释来定义查询,也可以隐式使用xml映射中定义的查询或通过@SelectProvider
使用查询生成器来定义查询。 构建器的目的与@Select
或xml映射的目的相同,即将provide the query text
给mapper。
映射器的实际实现由spring-mybatis
。 该实现是根据mapper类动态创建的。 实施是这样工作的:当被调用的映射器的方法,它使用反射来调用(如适当的方法selectOne
或selectList
基于在映射器的方法中定义的返回类型)上的MyBatis SqlSession
。 为此,它需要查询文本和参数。 查询文本来自builder / annotation / xml。 参数可用作映射器方法调用的参数。 然后, SqlSessoin
本身使用查询和参数来使用JDBC API执行查询。
MyBatis为诸如Spring AOP Proxy之类的映射器构建一个动态代理 ,因为MyBatis使用MapperProxyFactory创建具有代理接口 ( UserMapper
)的代理实例 MapperProxy 。
因此,当调用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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.