Mybatis源码学习

想要自己走一下试试。

 

public static void main(String[] args) {
    SqlSession sqlSession = null;
    try {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 查询数据库内容
        sqlSession = sqlSessionFactory.openSession();
        Blog blog = sqlSession.selectOne("me.aihe.dao.BlogMapper.selectBlog",1);
        System.out.println(blog);

    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

 

//1.读取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

Resources类

public static InputStream getResourceAsStream(String resource) throws IOException {
//classLoader默认为空
return getResourceAsStream((ClassLoader)null, resource);
}

public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
//调用ClassLoaderWrapper读取配置文件
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) { //没有读取到文件抛出异常
throw new IOException("Could not find resource " + resource);
} else { //返回流
return in;
}
}

ClassLoaderWrapper类

public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
return this.getResourceAsStream(resource, this.getClassLoaders(classLoader));
}
//创建classloader对象
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
return new ClassLoader[]{classLoader, this.defaultClassLoader, Thread.currentThread().getContextClassLoader(), this.getClass().getClassLoader(), this.systemClassLoader};
}

//把配置文件和生成的 classloader对象传过来
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
ClassLoader[] var3 = classLoader;
int var4 = classLoader.length;

for(int var5 = 0; var5 < var4; ++var5) {
ClassLoader cl = var3[var5];
if (null != cl) { //如果classloader对象不为空
InputStream returnValue = cl.getResourceAsStream(resource);
if (null == returnValue) {
returnValue = cl.getResourceAsStream("/" + resource);
}
//如果读取到配置文件返回流回去
if (null != returnValue) {
return returnValue;
}
}
}
//没有的话返回null
return null;
}


public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null; //返回一个流
} catch (IOException e) {
return null;
}
}

private final ClassLoader parent;

//这个方法获取到配置文件
public URL getResource(String name) {
URL url;
if (parent != null) {

// parent   ClassLoader对象
url = parent.getResource(name);
} else
{
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}

//获取到配置文件 开始返回

Mybatis源码学习

 

//2.创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 

努力学习,共勉.