Mybatis中Mapper接口如何和xml中的sql绑定&&工厂模式和动态代理在Mybatis中的应用

1. 在使用Mybatis时我们通常要写一个接口,然后XML里写对应的sql语句,那我们在调用接口的时候是如何跟XML中的语句做绑定的呢 下面我们分析下。

 

Mapper接口和XMLSQL绑定是在binding包中实现的。通过类名Proxy我们可以想到他是通过动态代理来实现。上图中SqlSession的getMapper方法最终调用的是MapperRegistry中的getMapper方法

下面对该包的类依次分析下

2.MapperRegistry通过MapperProxyFactory代理工厂来生产Mapper代理,它的knownMappers属性存的就是我们项目里写的所有Mapper接口,key就是Mapper接口的Class对象,Vaule是接口对象的代理工厂。

3.MapperProxyFactory类 顾名思义他是Mapper代理的工厂,用来生产Mapper接口的代理。它有两个属性

  (1)mapperInterface 指的就是我们写的Mapper接口, 例如我有个 UserMapper接口,mapperInterface 就是 UserMapper.class

    (2)  methodCache 是Mapper接口中的方法缓存, 例如我的UserMapper中有一个 selectUserById ,methodCache存的KEY就是selectUserById这个方法 value就是MapperMethod包含方法详细信息。

最终通过newInstance方法生成我们的Mapper代理。

 

4.然后看下MapperMethod类,他是用来记录Mapper中方法的详细信息,比如方法操作类型是 SELECT INSERT 或者 DELETE..,返回值的类型是啥,返回值是不是集合,map等 ,

那么mybatis是咋知道你的接口是查询,删除还是修改呢。如下它有俩属性 我们重点看下SqlCommand的构造器

(1)SqlCommand内部类,重点来了!resolveMappedStatement方法返回的MappedStatement对象包含的就是我们XML中的SQL语句信息,它是用methodName查的,这也就是为什么我们接口方法要和XML <select id="xx"

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值