mybatis手写源码实现

https://www.jianshu.com/p/73ee8caddc68

userMapper.java   接口   

userMapperXml .java 接口    里面定义了naemspace  statementId  sql  的对应关系  提供了可以根据statementId  找到对应的sql方法其实就是一个map

上面2个接口没继承关系 只是按照规则 类名 方法名 参数 要相同

excute  接口

excuteImp  底层具体实现  这个接口定义了 驱动链接 一些最基本的查询query  传入sql就可以 查询到结果

 

下面就很关键了  把上面2对类 联系起来

sqlSession  对外提供api

sqlSessionImp   具体实现

方法里面一个是对外提供接口(方法里面是excute 接口)实现和底层查询关系

还有一个获取被代理类  生成动态代理类

被代理类 方法执行的时候都会调用 sqlsession增强版invoke()方法  

首先根据被代理类method找到类名字(就是naemspace) 和xml是否想匹配 再找到方法名和xml statementId 想匹配不  再找到sql 

sql找到了 再找把sql传入 sqlSessionImp类对外提供接口(里面就是excute 接口)

 

执行userMapper.java  student findById(id)方法     就找到了sqlsession代理类 (提前生成了代理类) 就是invoke方法 和sqlsession原生有关联 这原生的又和excute 有关联  就一步步执行下去了

 

总结:你发现没有一直没有userMapper.java的实现类  我们知道接口需要实现类进行实例化的 那他的实现类哪里呢。其实动态代理实现了userMapper接口并且再上面增强了功能(引入了sqlSessionImp一些其他方法实现 再套用方法)。

动态代理是运行时候生成的 所以灵活性比较高  避免了接口的耦合性高。

 

转载于:https://www.cnblogs.com/yangmingyang/p/8570564.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值