四步
:1. 返回创建SqlSessionFactory对象
2. 返回SqlSession的实现类DefaultSqlSession对象
3. 返回一个MapperProxy的代理对象
4. 执行询流程。
SqlSessionFactoryBuilder().build(inputStream);
如何得到配置文件的内容?
创建解析器解析全局配置文件
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
得到全局配置文件的配置内容
解析每一个标签把详细信息保存在Configuration
中
//解析配置文件标签
build(parser.parse());
propertiesElement(root.evalNode("properties"));
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
全局配置文件中有该属性可以解析mapper.xml文件 也保存到Configuration中
<mappers>
<package name="dao" />
mappers>
Mapper.xml中的每个元素解析出来保存到全局配置中
将增删改查标签的每一个标签每一个属性也解析出来
封装到一个MapperedStatement
中
一个MapperedStatement就代表一个增删改查标签的详细信息
最后 return configuration;
包括全局配置信息和mapper.xml映射文件的各种信息
返回的configuration通过build
return new DefaultSqlSessionFactory(config);
configuration中
mapperRegistry属性保存的是代理类信息
mappedStatement属性保存的是增删查改等标签内容
总结:
把配置文件的信息解析保存到Configureation对象中
返回包含Configureation的DefaultSqlSessionFactory
第二步 :返回SqlSession的实现类DefaultSqlSession
对象
他里面包含了Executor(是用来增删改查的)和Configuration。
1. sqlSessionFactory.openSession();
2. 创建:获取一些信息 创建事务Transaction tx
3. configuration.newExecutor
4. 判断是否配置了二级缓存:
根据Exector在全局配置中的类型,
创建出 BatchExecutor/ReuseExecutor/SimpleExecutor
5. 根据某列的值改变封装行为
if (cacheEnabled)
进行封装
executor = new CachingExecutor(executor);
6. 调用拦截器方法,使用拦截器链
使用每一个拦截器重新包装Executor返回
executor = (Executor) interceptorChain.pluginAll(executor);
最后:
new DefaultSqlSession(configuration, executor, autoCommit);
总结:
创建DefaultSqlSession返回,包含Configurarion和Executor
第三步 :getMapper使用MapperProxyFactory创建一个MapperProxy的代理对象
代理对象里面包含了 DefaultSqlSession(Executor)
动态代理对象就可以使用DefaultSqlSession中的Executor
实现增删改查
configuration.getMapper
mapperRegistry.getMapper中:
根据接口类型knownMappers.get(type)
获得MapperProxyFactory 代理类工厂
然后创建了代理类
@SuppressWarnings("unchecked")
protected T newInstance(MapperProxy mapperProxy) {
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
final MapperProxy mapperProxy = new MapperProxy(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
}
过程:创建MapperProxy,它是一个InvocationHandler
然后创建MapperProxy的代理对象
MapperProxy implements InvocationHandler, Serializable {
//里面有接口信息
private final SqlSession sqlSession;
private final Class mapperInterface;
private final Map methodCache;
总结:
1、获取sqlSessionFactory对象:
根据配置文件(全局,sql映射)初始化出Configuration对象
解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;
注意:MappedStatement:代表一个增删改查的详细信息
2、获取sqlSession对象
返回一个DefaultSQlSession对象,包含Executor和Configuration;
这一步会创建Executor对象;
Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
3、获取接口的代理对象(MapperProxy)
DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
使用MapperProxyFactory创建一个MapperProxy的代理对象
代理对象里面包含了,DefaultSqlSession(Executor)
4、执行增删改查方法
1)调用DefaultSqlSession的增删改查(Executor);
2)会创建一个StatementHandler对象。
(同时也会创建出ParameterHandler和ResultSetHandler)
3)调用StatementHandler预编译参数以及设置参数值;
使用ParameterHandler来给sql设置参数
4)调用StatementHandler的增删改查方法;
5)ResultSetHandler封装结果
注意:
四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler)
这里主要涉及到了插件,后面会介绍。这里简单知道 pluginAll是用来拦截四大对象,
相当于web的拦截器作用