概述
mybatis的配置文件主要有2种:
- 核心配置文件,主要是一些开发环境变量。
- 表配置文件(sql映射文件),配置数据库表与实体的映射信息与该表关联的sql。
本篇文章主要介绍配置文件里面的一些标签。
核心配置文件mybatis-config
在mybatis框架中,所有的配置文件信息都被放在config配置对象中。
config对象何时被创建?
肯定是在处理xml文件的时候被创建的,也就是说需要跟进去这行代码:
这次的任务主要是看这些配置文件中的标签是如何被加载的。
内部执行了一个重载方法,参数为:输入流,开发环境,外部属性文件。
该重载方法,创建了一个xml文件的读取对象。这个对象对xmlparse进行了封装。创建对象是制定了资源,不做任何的业务工作。
具体的解析工作在调用parse.parse()的时候进行。
首先进行纠错,这也是一种必要的编程方式,逻辑之前先判错。
然后用parse对象解析出来configration标签节点。
这是一个根节点,从这里向下处理。可以用递归或者别的方法,解析出来其他的子标签。
接着看读取标签的解析函数:
把标签的内容依次读取到管理对象中。
这里以某个具体标签的读取为例子,如mappers:
这个标签的作用是帮助我们定位所有的sql映射文件的位置的:
里面有3种方式来定位文件:
还可以指定package标签,路径下的所有接口和sql配置文件将会产生映射关系。
继续打断点跟进去这个解析mappers的函数:
传进来的参数就是该标签包含所有内容的字符串。
读取的过程中,获得所有子标签进行遍历。
也就是我们的package标签。进入第一个判断中。
获得name属性,然后加载mapper文件,执行addmappers函数。
进入了config对象的该函数中,调用了mapper注册器的同名方法,跟进去看一下:
这里面的做的事情是把我们当前得到的信息放到一个map中去。
这里面用到了代理模式。接口式编程实际上就是代理模式的一种体现。
这个函数读取了包名下面的类,一般是mapper接口。
执行了addmapper方法。
进来之后先检查是不是接口,因为要用代理模式,必须是接口。
然后进行了一个重复的判断,不能读取重名的mapper。这里有防止多线程的味道。
接下来是用代理工厂,进行代理我们的mapper接口,跟进去看看,没啥东西。就是生成了接口的代理对象(用工厂命名不太好理解)。
回到上一级,就是把要代理的接口和代理工厂放到了一个已知的map里面去。
然后根据type的接口类型做一个注解的处理。但是demo没有注解。
然后做一个解析:
进来先把type变成字符串,就是1个:“interface com.xxx”的字符串。
然后检查是否是重复载入了。
没有重复载入的话,就去载入这个接口对应的xml文件。
为什么要强调接口名称要跟sql映射文件命名空间的名称是一样的,原因就在这里了,只有一样,才能根据接口去加载到xml文件。这里xml文件命名也是有规矩的,因为接下来解析的字符串要跟接口名字有关系:
然后去实现加载功能:
读取进来之后,xml解析器来解析这个sql映射文件的内容。
跟进去看一下:
进来还是先查重,一个sql映射文件在运行期间只能被加载一次。
首先解析mapper根目录标签:
然后加载sql映射文件中的内容:
以最多的sql语句的解析为例子。
接下来就会看到sql是怎么变成statement对象了。
40:24