1 SqlSessionFactoryBuilder
build()-> 获得配置文件 、解析全局配置和映射器文件(若已解析不会重复解析) -> 返回配置文件-> 构建成功返回sqlSessionFactory
解析全局配置
A: properties标签解析(db.properties)
B: settings解析(核心行为空控制,解析和处理分开。先解析最后处理,因为中间过程会调用)
B (loadCustomVFS(加载本地或远程文件)- >loadCustomLogImpl->处理类型别名->插件解析(分页插件、SqlIntercetptor插件)
C:创建返回对象和查询对象
D:处理赋值settings标签参数(二级缓存、执行器等等)
E:environment (事务管理、数据源)
F:typeHandler
G:mapperElement(配置mapper映射器,可通过Packge、resource、url、class配置)
注 G 步骤:一次解析mapper文件的namespace- cache- parameterMap- resultMap-sql- CURD标签(放到MappedStatement中,所有处理后的SQL都在这里)
2 SqlSession session =sqlSessionFactory.openSession 创建会话
A 通过TransactionFactory和DataSource拿到environment 拿到事务源,创建事务
B 创建执行器
a 创建执行器,默认simpleExecutor(BatchExecutor\ReuseExecutor 会缓存到一个map中 ),SimpleExecutor 使用后之间删除;
b 若开始二级缓存或默认二级缓存(开启),会用CachingExecutor包装执行器,否则走baseExecutor;
c 拦截器包装Executor,使用plaginAll 进行包装。
C return new DefaultSqlSession(config , executor, autoCommit)
3 sqlSession.getMapper(.class) 相当于拿到执行器
拿到一个接口类型和对应工厂类的map后,拿到接口类型对应工厂类,然后用JDK动态代理对接口进行代理,返回代理对象。
4 获得XXXMapper.方法名(参数)执行方法,并获取返回值。相当于执行器执行statement中的sql
选择调用sqlSession的方法, 执行selectOne(查询一个List,返回第一个结果,若查询到的是多个结果会报错),处理一级缓存,创建cacheKey,获取本地缓存,没有的话,查询数据库,存入本地缓存,使用默认SimpleExecutor执行器查询,进去JDBC步骤(
`a 获取configuration,其中有所有map映射文件信息,
b 创建statementHandler、parameterHandler、resultSetHandler
c 创建connection
d 处理输入参数,处理sql ,执行sql ,得到结果集,处理输出结果。
返回输出结果
`