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(方法的元信息)的各种方法,反正看了一圈之后,对动态代理更加熟悉了一丢丢。
网友评论