InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession session= sqlSessionFactory.openSession();
UserMapper mapper =session.getMapper(UserMapper.class);
1.获取Mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
- 调用Resourse类的getResourseAsStream(String resourse)方法,其中参数为"mybatis-config.xml",是mybatis的配置文件。
- getResourseAsStream(String resourse)方法调用同一个类中getResourseAsStream(ClassLoader loader,String resourse)方法。
- getResourseAsStream(ClassLoader loader,String resourse)方法中调用ClassLoader类的getResourseAsStream(String resourse,ClassLoader loader)方法。
- getResourseAsStream(String resourse,ClassLoader loader)方法调用同一个类中的getResourceAsStream(String resource, ClassLoader[] classLoader)方法。该方法中对传入的Classloader数组进行遍历,对每一个classloader调用getResourceAsStream(String resourse)方法获取InputStream的实例。
2.获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
- 新建SqlSessionFactoryBuilder对象。
- 通过SqlSessionFactoryBuilder调用build(InputStream inputStream)方法。
- build(InputStream inputStream)调用同一个类中的build(InputStream inputStream, String environment, Properties properties)方法。
- build(InputStream inputStream, String environment, Properties properties)方法中新建一个XMLConfigBuilder类的对象parser。
- 通过parser调用parse()方法解析is,返回configuration。
- parse()方法中调用parseConfiguration(XNode root)方法,解析获取配置文件的每一个标签信息。
- 通过SqlSessionFactory类的build(Configuration config)方法,把获取到的配置信息封装到DefaultSqlSessionFactory中。
3.获取SqlSession对象
SqlSession session= sqlSessionFactory.openSession();
- 调用sqlSessionFactory的openSession()方法。
- openSession()方法调用同一个类中的openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)方法。
- openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)方法中创建了Transaction对象,通过configationd的newExecutor(Transaction transaction, ExecutorType executorType)方法获取Executor对象,最后创建了DefaultSqlSession对象。
4.获取mapper
UserMapper mapper =session.getMapper(UserMapper.class);
- 调用session的getMapper(Class<T> type)方法。
- getMapper(Class<T> type)方法中调用Configuration类的getMapper(Class<T> type, SqlSession sqlSession)方法。
- getMapper(Class<T> type, SqlSession sqlSession)中调用MapperRegistry类的getMapper(Class<T> type, SqlSession sqlSession)方法。
- getMapper(Class<T> type, SqlSession sqlSession)方法中调用MapperProxyFactory<T>类的newInstance(SqlSession sqlSession)方法。
- newInstance(SqlSession sqlSession)方法创建MapperProxy<T>对象mapperProxy,再调用同一个类的newInstance( MapperProxy<T> mapperProxy)方法,返回mapper。