a.MyBatis框架的结构:
b.MyBatis执行过程:
- 1.mybatis配置:
SqlMapConfig.xml
,此文件作为mybatis的全局配置文件
,配置了mybatis的运行环境
等信息。mapper.xml
文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载
。
- 2.通过mybatis环境等配置信息
构造SqlSessionFactory即会话工厂
- 3.由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
- 4.
mybatis底层自定义了Executor执行器接口操作数据库
,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。 - 5.
Mapped Statement
也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id
。 - 6.
Mapped Statement
对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。 - 7.
Mapped Statement
对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
c.MyBatis执行原理:
首先需要解析配置(MyBatis-config.xml),将配置文件的内容转换为Java对象(Configuration)加载到内存中,包括一些xxxMapper.xml文件,将这些文件解析成MappedStatement对象,保存其SQL语句、参数映射等信息
我们在代码里面写的Mapper都是接口,实际的实现类是由MyBatis利用JDK动态代理生成的,具体是在MapperProxyFactory中生成的代理类
当调用Mapper接口中的方法的时候,代理对象会将调用的信息传递给MyBatis内部的MapperProxyFactory对象,实际上调用方法时,会触发MapperMethod来执行具体逻辑
可以看到里面分类 insert、update、delete等不同的处理方法,这时候就可以执行具体的语句了
这里先解释下Command是什么,他是MapperMethod内部的一个属性
这个command就是通过调用的接口名 + 方法名,从Configuration中找到MappedStament对象,这个记录了SQL内容、出参入参等等,这样就得到了最终的SQL相关信息了,跟前面的配置串起来了
MyBatis还有缓存机制,会经过CachingExecutor的处理,这里主要是二级缓存的处理。
最终还是会看到JDBC执行SQL的流程,从下面的代码可以看到,获取connection实际上会从连接池中获取,且得到Stateent
然后调用exectute执行
最终通过resultSethandler处理查询得到的结果,将其映射到对应的实体对象