MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
接下来是对MyBatis底层源码的分析
1、获取传入的XML文件
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
首先调用getResourceAsStream(String resource)方法,传入mybatis-config.xml文件
然后调用getResourceAsStream(ClassLoader loader, String resource)方法
通过classLoaderWrapper.getResourceAsStream(resource, loader)方法来获取流,再调用getResourceAsStream(resource, loader)方法,然后再调用了本类中的getResourceAsStream(String resource, ClassLoader[ ] classLoader)方法
最后判断类加载器中所读的流是否为null,如果不为null,则返回InputStream对象。
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;
}
2、获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
首先创建SqlSessionFactoryBuilder对象;然后调用build(InputStream inputStream)方法;再调用本类中的build(InputStream inputStream, String environment, Properties properties),然后创建解析器parser,通过Xpath解析的方式去解析mybatis-config.xml 文件,保存到configuration对象中 ,后返回DefaultSqlSessionFactory对象。
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
}
}
}
3、获取SqlSessiion对象
SqlSession session = sqlSessionFactory.openSession();
首先调用openSession()方法,再去调用本类中的openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)方法。接而创建事务tx,获取environment信息,通过environment构建出transactionFactory事务工厂,通过事务工厂对事物进行设置。newExecutor(),根据Executor在全局配置中的类型,创建出对应的执行器,最后返回 DefaultSqlSession对象。
4、获取mapper
UserMapper mapper = session.getMapper(UserMapper.class);