1、获取sqlSessionFactory对象:
解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;
注意:【MappedStatement】:代表一个增删改查的详细信息
2、获取sqlSession对象
返回一个DefaultSQlSession对象,包含Executor和Configuration;
这一步会创建Executor对象;
3、获取接口的代理对象(MapperProxy)
4、执行增删改查方法
MyBatis中的四大对象
• Executor执行器 (update, query, flushStatements, commit, rollback,
getTransaction, close, isClosed)
• ParameterHandler参数处理器 (getParameterObject, setParameters)
• ResultSetHandler结果集处理器 (handleResultSets, handleOutputParameters)
• StatementHandler sql语句处理器 (prepare, parameterize, batch, update, query)
1、获取sqlSessionFactory对象:
1.获取sqlSessionFactory对象:
2.SqlsessionFactoryBuilder.build
3.创建解析器parser
4.解析每一个标签把详细信息保存在Configuration 中
5.解析mapper.xml,mepper.xml的每一个元素信息解析出来保存在全局配置
将增删改查标签的每一个标签每一个属性解析出来,封装成一个MappedStatement,一个MappedStatement代表一个增删改查标签
6.解析每一个标签把详细信息保存在Configuration 中
7.parse方法最终返回了Configuration
8.build(configuration)方法返回了defaultSqlSessionFactory对象
-
先获取mybatis的配置文件,解析成流对象(字符流和字节流都可以)Reader和InputStream都可以
-
通过SqlSessionFactoryBuilder根据mybatis的配置文件流创建一个Configuration对象
-
SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSqlSessionFactory(SqlSessionFactory的默认实现类)
-
DefaulatSqlSessionFacotry根据传入的参数,创建一个DefaultSqlSession对象,里面包含了Configuration(SqlSession的默认实现类)
2、获取sqlSession对象
由之前解析可知,mybatis启动的时候会加载XML配置文件解析生成全局配置对象Configuration对象,SqlSessionFactoryBuilder类会根据Configuration对象创建一个DefaultSqlSessionFactory对象,而DefaultSqlSessionFactory对象实现了SqlSessionFactory中的创建SqlSession的方法,最终新建了一个SqlSession接口的默认实现类DefaultSqlSession
SqlSession openSession = sqlSessionFactory.openSession();
@Override
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
从configuration中拿到ExecutorType:执行器类型
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();//根据Configuration获取环境参数对象
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);//根据环境参数对象获取事务工厂对象
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//根据事务工厂创建新的事务对象
final Executor executor = configuration.newExecutor(tx, execType);//根据Configuration获取执行器对象
return new DefaultSqlSession(configuration, executor, autoCommit);//根据3个参数创建DefaultSqlSession对象
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
executor=configuration.newExecutor(tx, execType);//根据Configuration获取执行器对象
executor在这时会被拦截器(插件)包装
返回DefaultSqlSession(configuration, executor, autoCommit);//根据3个参数创建DefaultSqlSession对象
3、获取接口的代理对象(MapperProxy)
会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
1.这个getmapper方法调用了configuration的.getMapper方法
2.这个configuration的getMapper方法调用了mapperRegistry的getMapper方法
3. 根据接口类型拿到mapperProxyFactory对象
4. mapperProxyFactory.newInstance(sqlsession)
5. newInstance方法创建MapperProxy对象,他是一个InvocationHandler对象
6.
7.返回一个代理对象
4、执行增删改查方法
mapperProxy代理对象调用invoke()方法
返回mapperMethod对象的execute(sqlsession,args)方法
1)、调用DefaultSqlSession的增删改查(Executor);
2)、会创建一个StatementHandler对象。
(同时也会创建出ParameterHandler和ResultSetHandler)
3)、调用StatementHandler预编译参数以及设置参数值;
使用ParameterHandler来给sql设置参数
4)、调用StatementHandler的增删改查方法;
5)、ResultSetHandler封装结果
注意:
四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);