为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis - QueryBuilder 类中的参数映射

Mybatis - QueryBuilder 类中的参数映射

慕后森 2021-08-04 17:41:43
我很习惯使用 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”接口中定义。
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

MyBatisSpring 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直接。


查看完整回答
反对 回复 2021-08-04
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

重要的是UserQueryBuilder没有获取UserMapper接口中定义的参数。

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

  1. 映射器的客户端

  2. 映射器接口

  3. 查询生成器

  4. spring-mybatis 库

  5. mybatis 库

映射器接口的目的是:

  1. 指定将使用的查询

  2. 指定查询需要的参数

  3. 定义实际的java接口

Mapper 可以直接使用注释来定义查询,例如@Select,隐式使用 xml 映射中定义的查询或通过 使用查询构建器@SelectProvider。builder 的目的与 of@Select或 xml 映射相同,即provide the query textto mapper。

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


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 331 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信