我很习惯使用 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”接口中定义。
MyBatis像Spring 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] 删除。
我来说两句