Mybatis运行原理简要分析
1.SqlSessionFactory的构建
SqlsessionFactory主要用来创建SqlSession,为了构建SqlsessionFactory,需要提供配置文件以及相关参数。
构建主要分为2步:
- 解析配置文件并生成Configuration对象。
- 通过Configuration创建SqlSessionFactory。
1.1构建Configuration
它的作用如下:
- 读取配置文件,包括基础配置的XML和映射器的文件。
- 初始化基础配置信息,如properties全局参数、settings设置、typeAliases别名、typeHandler类型处理器、ObjectFactory对象、plugin插件、environment环境、Mapper引射器、数据库标识。
- 提供单例,为后续创建SessionFactory服务并提供配置的参数。
- 执行一些重要的对象方法,初始化配置信息。
1.2映射器的组成
一般由3部分组成。
- MappedStatement,保存映射器的一个节点(select/insert/delete/update)。包括配置的SQL、SQL的id、缓存信息、resultMap、resultType、parameterType、languageDriver等。
- SqlSource,提供BoundSql对象的地方,是上面部分的一个属性。是一个接口,用来组装SQL。
- BoundSql,用于建立SQL和参数。
其中BoundSql提供3个主要的属性:
- parameterMappings:一个List用来描述参数信息,比如属性、名称、表达式、javaType、jdbcType、typeHandler等。并与PreparedStatment结合来设置参数。
- paeameterObject:用于传递简单对象、POJO、Map、@Param注解的参数。传递简单对象,如int、String、double,将他们包装为对应的对象传递;POJO、Map报出不变;传递多个参数是,如有@Param注解则变为Map<String,Object>对象,类似于如下所示,可以使用#{param1}或者#{1}去引用第一个参数。
如果使用@Param注解,则会把注解中的字段作为Map对象中的key。{"1":p1,"2":p2,...,"param1":p1,"param2":p2,...}
- sql,即在映射器中编写的每条SQL。
1.3构建SqlSessionFactory
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);
2.SqlSession的运行
2.1映射器的动态代理
Mapper映射过程不仅利用了动态代理模式,还有命令模式。
2.2SqlSession的对象
通过执行以下4个步骤来完成数据库操作和结果返回。
- Executor执行器,调度以下3种对象来执行对应的SQL。
- StatementHandler使用数据库的Statement/PreparedStatement执行操作。
- ParameterHandler用于SQL对参数的处理。
- ResultHandler封装数据集Result并返回。