关于 Mybatis mapper 之见解

2021-01-19  本文已影响0人  放开那个BUG

1、疑惑

看了一些中间件代码,最大的疑惑是 mybatis 更像是一种工具一样,并不是类似于 kafka 之类的 server、client 模式,它本身没有看到任何的 main 方法,直接是拿来即用(当然有一些流程顺序),像是粘合剂,所以我一直以 server、client 模式理解它是不对的。

2、mapper 接口与映射文件绑定流程

以 mybatis 自身的 test 为例:


test

可以看到我们获取 mapper 接口,执行 mapper 中的方法之前,先进行了配置文件的加载。而配置文件指明了我们要加载的 mapper.xml 文件是什么。


mapper.xml 文件位置

流程:
1.在这两句话执行的时候,特别是执行到 build 方法时,mybatis 会先加载 mybatis-confg.xml 文件,然后在此配置文件中解析到对应的 mapper.xml 文件。

Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/rounding/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

根据 mapper.xml 文件的内容,解析其中的方法,将方法的全路径名作为 key,某些一大坨作为 value(此 map 名为 mappedStatements,包括了原始 sql,但是此时参数未替换,执行时候再替换),如下图所示:


key、value 对应关系

3、执行 mapper 方法

SqlSession session = sqlSessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
User user = mapper.getUser(1);

执行 mapper 方法的时候,先根据 mapper 接口名拿到对应的代理类,然后调用代理类的方法进行方法调用。


代理类执行方法

此时会从 mappedStatements 拿出对应的方法,然后进行参数替换,执行使用数据库连接执行 sql。

4、感想

mybatis 大量运用了 class(类的元信息)、method(方法的元信息)的各种方法,反正看了一圈之后,对动态代理更加熟悉了一丢丢。

5、参考资料

https://mp.weixin.qq.com/s/UqgXw0qOW1H1-Dqh5NtueA

上一篇下一篇

猜你喜欢

热点阅读