我很习惯将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'中定义的“第一”和“最后”参数值界面。
答案 0 :(得分:1)
重要的是UserQueryBuilder
不会获得UserMapper
界面中定义的参数。
有几个参与查询执行的组件:
映射器界面的目的是:
映射程序可以直接使用诸如@Select
之类的注释来定义查询,也可以隐式使用xml映射中定义的查询或通过@SelectProvider
使用查询构建器。构建器的用途与@Select
或xml映射相同,即到provide the query text
到映射器。
spring-mybatis
提供了映射器的实际实现。该实现是根据mapper类动态创建的。该实现的工作方式是这样的:调用映射器上的方法时,它会在mybatis {{1上使用反射来调用适当的方法(例如selectOne
或selectList
(基于映射器方法中定义的返回类型)) }}。为此,它需要查询文本和参数。查询文本来自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 一样。>