2 回答
TA贡献1811条经验 获得超4个赞
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直接。
TA贡献1793条经验 获得超6个赞
重要的是UserQueryBuilder
没有获取UserMapper
接口中定义的参数。
有几个组件参与查询执行:
映射器的客户端
映射器接口
查询生成器
spring-mybatis 库
mybatis 库
映射器接口的目的是:
指定将使用的查询
指定查询需要的参数
定义实际的java接口
Mapper 可以直接使用注释来定义查询,例如@Select
,隐式使用 xml 映射中定义的查询或通过 使用查询构建器@SelectProvider
。builder 的目的与 of@Select
或 xml 映射相同,即provide the query text
to mapper。
映射器的实际实现由spring-mybatis
. 该实现是基于映射器类动态创建的。实现是这样工作的:当映射器上的方法被调用时,它使用反射来调用 mybatis 上的适当方法(如selectOne
或selectList
基于映射器方法中定义的返回类型)SqlSession
。为此,它需要查询文本和参数。查询文本取自 builder/annotation/xml。参数可用作映射器方法调用的参数。然后SqlSessoin
本身使用查询和参数来使用 JDBC API 执行查询。
添加回答
举报