什么是mybatis?MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。简单点说,mybatis就是jdbc的框架。
要了解mybatis的底层,首先我们要了解mybatis的使用步骤。通过mybatis查询数据,总共有六步,如下:

这前五步中,只有两个地方是要我们自定义的,第一是加载配置文件,sqlmapconfig.xml文件是存储jdbc连接信息的,而,usermapper.class的作用我们在后面再概述。
接下来,我们将通过讲解前面五步来了解mybatis的底层原理。
第一步。将配置文件转换为流对象,具体实现如下:

第二步。创建建造者类。
第三步。以第一步获取到的流对象为参数,传入到建筑者对象的build方法中,获取工厂对象。
将流对象传入到build方法中,到底做了些什么呢?

此时我们可以看见,在build方法中new了一个defaultsqlsessionfactory对象,是不是跟工厂类很像呢?对了,工厂类是一个接口,而defaultsqlsessionfactory是工厂类的实现类,而在build方法中又调用了defaultsqlsessionfactory的setIn方法,这里面有实现了什么呢?我们来看一下defaultsqlsessionfactory中setIn方法的实现。

通过上面代码,我们可以看出,这是将流对象传入到defaultsqlsessionfactory的实例中,此时我们的思路也就中断了。这时我们就要通过接下来的步骤来继续了解了。
第四步,获取sqlsession对象,调用的是defaultsqlsessionfactory中的opensession方法来获取。接下来,我们就需要看看opensession到底做了何事了。

我们可以看到这一行

这一行又做了什么呢?在看具体实现前,我们先思考一下,将流对象传入,很可能就是要对流对象进行操作了。
而且传入defaultsession对象,应该是对defaultsession对象的变量进行赋值。
让我们看下defaultsession对象中有些什么

这是defaultsession中的成员变量。再让我们回到前面一步。看看到底对这个变量做了些什么

通过上面代码我们可以发现,通过操作流对象,我们将xml文件中的信息读取到了conf对象中,再将conf对象封装到sqlsession中
最后一步,也是最重要的一步,前面的内容都是为最后一步做铺垫。

我们来看一下sqlsession中getmapper方法的具体实现。
(未完待续。。)
网友评论