大致流程:由IO流获取文件信息,再通过IO流去得到SqlSessionFactory,由SqlSessionFactory得到SqlSession,最后通过SqlSession获取到mapper
总体代码:
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
具体细节:
1.
InputStream is = Resources.getResourceAsStream(resource);
public static InputStream getResourceAsStream(String resource) throws IOException {
return getResourceAsStream(null, resource);
}
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
for (ClassLoader cl : classLoader) {
if (null != cl) {
// try to find the resource as passed
InputStream returnValue = cl.getResourceAsStream(resource);
// now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
if (null == returnValue) {
returnValue = cl.getResourceAsStream("/" + resource);
}
if (null != returnValue) {
return returnValue;
}
}
}
return null;
}
- 调用getResourceAsStream获取mybatis-config.xml。
- getResourceAsStream调用 getResourceAsStream(String resource) 。
- getResourceAsStream(String resource) 调用classLoaderWrapper下的getResourceAsStream(resource, loader)。
- 最后由classLoader[ ] 实现
2.
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}
public class DefaultSqlSessionFactory implements SqlSessionFactory
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
- build函数通过Xpath解析获得configuration.
- 通过configuration得到DefaultSqlSessionFactory,
- 再由 DefaultSqlSessionFactory获得SqlSessionFactory
3.
SqlSession session = sqlSessionFactory.openSession();
public SqlSession openSession(ExecutorType execType, boolean autoCommit) {
return openSessionFromDataSource(execType, null, autoCommit);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} 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();
}
}
- 调用openSession().
- openSession调用openSessionFromDataSource(exectype,null,autoComit),通过此函数获取事务,对应的执行器,事务自动提交 以及配置文件对象(Configuration)
- 最后返回DefaultSqlSession。
4.
UserMapper mapper = session.getMapper(UserMapper.class);
@Override
public <T> T getMapper(Class<T> type) {
return configuration.<T>getMapper(type, this);
}
调用函数getMapper得到mapper.