1.SqlSessionFactory的创建
1.1.获取配置文件流,通过SqlSessionFactoryBuilder的build方法返回一个SqlSessionFactory
1.2.build会创建一个XPathParser解析器去解析配置文件
1.3.XPathParser解析器将解析的内容设置到Configuration对象中
1.4.接着创建一个mapper的解析器去解析mapper.xml文件,解析的内容同样保存在Configuration
1.5.针对<select><update><delete><insert>
等标签,会创建一个statment的解析器去解析增删改查标签内容,将解析的内容分别封装到标签对应的MappedStatement(一个MappedStatement代表一个增删改查的标签)
1.6.所有配置文件解析完,返回一个configuration对象,该对象保存了配置文件和mapper.xml文件的所有信息(每一个接口对应一个MappedProxy,我们拿到的都是接口的代理对象;接口的每一个方法对应一个MappedStatement)
1.7.用Configuration对象build一个DefaultSqlSessionFactory(这是SqlSessionFactory接口的实现类,里面保存了拥有全部配置文件的信息的configuration对象)
总结:解析所有配置文件并将解析的信息保存到Configuration,最后返回一个包含全部配置信息Configuration的SqlsessionFactory接口的实现类DefaultSqlSessionFactory
2.获取SqlSession对象
2.1.调用SqlSessionFactory的openSession()方法
2.2.openSession()方法中实际调用了openSessionFromDatasource()方法,从数据源获取Session对象
2.3.从Configuration 对象获取环境变量等信息,然后创建一个执行器Executor,然后在拦截器中对Executor进行包装
2.4.创建并返回DefaultSqlSession(SqlSession接口的实现类),包含Configuration、Executor
3.获取mapper接口的实现类
3.1.调用getMapper()方法通过接口类型创建接口的代理对象MapperProxy,包含SqlSession对象
4.执行增删改查方法
4.1.MapperProxy调用invoke()方法,在invoke()方法中会判断要执行的方法是Object还是接口的,如果是Object则直接执行,属于接口的方法,然后调用方法的execute方法,需要传入sqlsession和参数
4.2.判断增删改查类型,包装参数成map对象或者直接返回(参数个数大于1,包装常map对象)
4.3.然后根据参数的和方法名调用SqlSession的增删改查方法,SqlSession最终调用Exe
cutor的增删改查方法
4.4.Executor会创建StatementHandler来处理sql语句的预编译以及设置参数等工作
4.3.创建StatementHandler的时候同时创建ParameterHandler来对sql语句进行预编译、设置参数,创建ResultSetHandler来处理结果集
4.4.ParamterHandler和ResultSetHandler都借助TypeHandler进行数据库表和javaBean的映射