GitHub:https://github.com/JDawnF
一、Mapper接口的工作原理
Mapper 接口,对应的关系如下:
-
接口的全限名,就是映射文件中的
"namespace"
的值。 -
接口的方法名,就是映射文件中 MappedStatement 的
"id"
值。 -
接口方法内的参数,就是传递给 SQL 的参数。
Mapper 接口是没有实现类的,当调用接口方法时,接口全限名 + 方法名拼接字符串作为 key 值,可唯一定位一个对应的 MappedStatement 。举例:com.mybatis3.mappers.StudentDao.findStudentById
,可以唯一找到 namespace 为 com.mybatis3.mappers.StudentDao
下面 id为 findStudentById
的 MappedStatement 。
总结来说,在 Mybatis 中,每一个 <select />
、<insert />
、<update />
、<delete />
标签,都会被解析为一个 MappedStatement 对象。
Mapper 接口的实现类,通过 MyBatis 使用 JDK Proxy 自动生成其代理对象 Proxy ,而代理对象 Proxy 会拦截接口方法,从而“调用”对应的 MappedStatement 方法,最终执行 SQL ,返回执行结果。整体流程如下图:
其中,SqlSession 在调用 Executor 之前,会获得对应的 MappedStatement 方法。例如:DefaultSqlSession#select(String statement, Object parameter, RowBounds rowBounds, ResultHan