mybatis Mapper接口映射Mapper.xml代码分析

谁借莪1个温暖的怀抱¢ 2022-03-16 17:54 667阅读 0赞

我们在使用mybatis时,会用到Mapper接口映射Mapper.xml,具体怎么映射的我们不知道。只知道要这么用,下面我们开始分析mybatis代码。

在分析具体代码时,我们有必要先看一下jdk动态代理。

简单点说:jdk动态代理,可以让我们在不实现接口的情况下,去动态生成接口的实现。

传统上我们要去实现接口,都会创建具体的实现类.java, 而jdk动态代理,可以让我们不用创建具体的实现类.java,就可以生成接口实现。

代码如下:

  1. /**
  2. * 代理工具方法,可以为任意接口生成任意实例代理,该方式使用在了mybatis的Mapper接口映射Mapper.xml中,具体在 MapperProxyFactory
  3. * @param tClass
  4. * @param invocationHandler
  5. * @param <T>
  6. * @return
  7. */
  8. public <T> T test4(Class<T> tClass, InvocationHandler invocationHandler) {
  9. T t = (T) Proxy.newProxyInstance(tClass.getClassLoader(), new Class[] {tClass},invocationHandler);
  10. return t;
  11. }
  12. @Test
  13. public void test6() {
  14. UserMapper userMapper = test4(UserMapper.class, new InvocationHandler() {
  15. @Override
  16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  17. System.out.println("查询所有");
  18. return null;
  19. }
  20. });
  21. userMapper.getAll();
  22. }

UserMapper为接口,上面的代码就直接生成了UserMapper的实现。

执行结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70

可以看到我们已经成功生成了UserMapper的实现,方法也正常执行了。

mybatis正是使用了该特性进行Mapper接口与Mapper.xml进行映射。

mybatis代码如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 1

具体方法映射在mapperProxy的invoke方法中完成。 如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 2

进而到MapperMethod中,如下:

20190311192359961.png

然后是SqlCommand,如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 3

继续往下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 4

statementId就是我们的接口完全限定名加方法名。获取对应的MappedStatement后,进行下一步处理。这里我们肯定会想,这个MappedStatement是怎么生成的,生成就是在解析Mapper.xml时生成的,代码如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 6

上面的id就是namespace+ select,update,delete,insert的id。

从这里也可以看到我们Mapper.xml的namespace必须的是Mapper接口的完全限定名,select,update,delete,insert的id也必须是接口的方法名。否则使用接口去映射时就会报错。

xml解析完毕后,就调用如下方法,生成接口的代理类,并将接口中方法上的mybatis注解,生成MappedStatement,代码如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 7

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM4NTU4MDc2_size_16_color_FFFFFF_t_70 9

发表评论

表情:
评论列表 (有 0 条评论,667人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mybatis:接口映射

    概念 面向接口编程,可以调用自定义的接口方法,然后实现,执行对应的sql 步骤 1. 自定义一个接口一般他的名字与mapper文件一致 Tea

    相关 Mybatis映射文件Mapper

    前提说明 1. 使用Dao接口+映射文件的方式创建Dao对象 2. 在接口方法参数中可以使用@Param(“别名”)来指定当前参数的名称,在映射文件中使用\\{别名\