开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第38天,点击查看活动详情
MyBatis源码初步
前面说到了MyBatis中SqlSession的实例化过程以及配置信息的加载,之后就可以投入使用了。接下来我们往下看看提交一条SQL需要做什么操作。
映射接口文件与映射文件的绑定
MyBatis为我们提供了接口和SQL的xml文件映射,我们可以通过SqlSession获取我们自己定义的接口Mapper对象。通过mapper就可以操作数据库。映射接口文件是指 UserMapper.class等存有接口的文件,而映射文件是指 UserMapper.xml等存有 SQL操作语句的文件。我们获取mapper对象可以通过如下代码:
UserMapper userMapper = session.getMapper(UserMapper.class);
该操作通过 Configuration类的 getMapper方法转接,最终进入 MapperRegistry类中的getMapper方法。MapperRegistry类中的 getMapper方法如下。
getMapper方法通过映射接口信息从所有已经解析的映射文件中找到对应的映射文件,然后根据该映射文件组建并返回接口的一个实现对象。
映射接口的代理
我们已经知道session.getMapper(UserMapper.class)方法最终得到的是mapperProxy Factory.newInstance(sqlSession)返回的对象。那该对象到底是什么呢?我们追踪该方法,可以在MapperProxyFactory类中找到方法。
其实就是将原来的接口进行了代理,返回的是代理后的对象,那么代理对象又做了什么呢?我们接着来看下代理的invoke方法。
接着断点会进入MapperMethod,触发 MapperMethod对象的 execute方法,如下所示。
MyBatis根据不同数据库操作类型调用了不同的处理方法。当前项目进行的是数据库查询操作,因此会触发代码中的
result=executeForMany(sqlSession,args)语句。
到此,MyBatis 已经完成了为映射接口注入实现的过程。于是,对映射接口中抽象方法的调用转变为了数据查询操作。