Mybatis-概览地图

思考: “为什么在使用 Mybatis 的时候,只需定义一个接口,不用写实现类就能使用XML中或者注解上配置好的SQL语句,就能完成对数据库 CRUD 的操作呢?”

这是因为用到了接口代理类,把每一个数据库操作的DAO接口都用操作数据库的代理类实现,并注册到Spring容器让用户去使用。从代码层面来看, 主要是两个东西, 一个是mapperRegistry, 还有一个是mappedStatements.

mapperRegistry存储的是(接口全路径, MapperProxyFactory)键值对.  通过MapperProxyFactory可以创建MapperProxy.

mappedStatements存储的是(接口全路径+方法名, mappedStatement), 当sqlSession.getMapper返回的是一个MapProxy, MapProxy执行某个sql语句时, 通过MapProxy与调用的接口的名字可以组成一个key, 之后通过这个key可以到mappedStatements找到这个接口的具体实现, 即一个mappedStatement.  这也是为什么DAO接口的路径要与mapper配置文件中的nameSpace一致, 以及 DAO接口中的方法, 要与mapper配置文件中的sql片段中"id"属性内容一致. 这些都是为了后续缓存的key好匹配.

 

图片摘选链接:手写Mabatis

 

posted @ 2023-03-01 09:59  小兵要进步  阅读(14)  评论(0编辑  收藏  举报