mybatis实际上就是对jdbcTemplate封装,将其 开辟连接 事务管理
sql执行 pojo返回 连接关闭 这些功能做了封装,让其更加方便
简述mybatis的执行流程:
1.读取mybatis.config.xml配置文件
2.将配置文件解析为Configuration对象
3.通过SqlSessionFactoryBuilder().build将Configuration对象注入SqlSessionFactory,获取SqlSessionFactory对象
4.通过SqlSessionFactory的openSession方法获取SqlSession对象
5.调用API通过执行器Executor执行并将处理好的结果返回
实际上就这这些东西,下面就将这些流程分析一下
1.读取配置文件将其解析为Configuration对象
- 通过读取本地配置文件Resources.getResourceAsStream(“mybatis-config.xml”)方法,将配置文件信息读取为一个输入流,并将其注入到SqlSessionFactoryBuilder.build(is)去解析
下面就使用debug去走一下这个流程,
可以清楚的看到配置文件被读取为一个BufferedInputStream流
build方法是有多个重载方法的,最终调用的实际上是下面这个方法
这个实际上就是在初始化一些对象,东西很多都是能用到的,我也没有仔细研究过。this.build(parser.parse())这个方法才是实际上赋值的方法
接下来就是赋值的具体流程了,
这里配置很多对象,这里简述一下别名映射和处理mapper
别名映射注入流程
这些别名映射就是你在mapper.xml文件当中配置的
我们使用的时候还有许多例如string,int这些信息不需要我们配置就可以直接使用,这些真的不需要配置吗?
上面可以看出别名映射的信息实际上是通过一个map储存的,那么就让我们打开查看一下其中的信息
这就是别名映射的注入流程
mapper注入全流程
mapper当中的<select<insert这些标签最终会被解析为一个mappedstatement对象,使用map的方式将其储存在configuration对象当中,每一条语句都会解析为两个mappedstatement对象,key值为其命名空间加标签id或者标签id
这里肯定会思考sql语句储存在什么地方,实际上是储存在sqlsource当中
大概流程就是这样,值得注意的是二级缓存如果打开后,每个标签是可以配置的,其中有一个缓存刷新只有select标签默认是关闭的,其他标签是打开的,mappedstatement也会将这些信息储存起来。
2.传递Configuration对象最终构建SqlSession对象
1.构建SqlSessionFactory
2.构建SqlSession