Mybatis实施过程分析(附深度文章推荐& amp;ampamp面试问题集)

如果要设计一个半自动模仿Mybatis的框架,哪些环节是必不可少的?三思而行,肯定有以下几个环节:

如果只考虑这三点,很容易实现一个简单的ORM框架,加上一些反射和正则表达式就可以了。

那么如果参考Mybatis,我们来看看它的几个环节是怎么设计的:

其实大致思路是一样的。你需要一个数据结构来存储所有的变量,并通过接口代理调用Sqlsession中的内置方法。不同的是,真正的执行器又加了一层,就是执行器,然后通过原来的JDBC把数据返回给调用者。当然,真正的Mybatis包括很多设计模式、数据源、缓存、动态SQL、数据库事务、延迟加载处理等等。

为了验证mybatis的执行过程,使用了两种方式调用接口,如下所示:

& gt

这里有一个小点需要强调,真正的执行者是` ` Executor ` ` `,我们每次都使用下面的代码:

通过查看源代码,还可以看到SqlSession接口的默认实现类是DefaultSqlSession。

以及方法的实际执行,如selectList方法:

& gt

# {}是预编译处理,$ {}是字符串替换。当Mybatis处理# {}时,会将sql中的# {}替换为?数字,调用准备好的报表的

设置分配值的方法;

Mybatis在处理的时候,是替换时间,也就是用一个变量的值替换{}。

使用# {}可以有效防止SQL注入,提高系统安全性。

PS: MyBatis执行的本质是SQL,所以回归本质可以简单理解为PreparedStatement和相应的语句。

Dao接口是映射器接口,接口的全限定名是映射文件中namespace的值;接口的方法名是映射文件中映射器的语句的id值;接口方法中的参数是传递给sql的参数。

实现原理:mapper接口的工作原理是JDK动态代理。mybatis会为每个Mapper代理生成一个mapperProxy对象,代理对象会拦截接口方法,接口方法会自动对应sqlsession,最后由' Executor '执行。

``不同的参数,方法不能重载``,为什么?

如上所述,mybatis有一个解析XML文件或接口的链接,它会构建一个名为mapperStatement的对象来存储Mapper的相关信息。每个dao接口方法在执行时是如何定位并找到对应的MapperStatement的?

源逻辑图: