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一些其他方法实现 再套用方法)。
动态代理是运行时候生成的 所以灵活性比较高 避免了接口的耦合性高。
浙公网安备 33010602011771号