詳解MyBatis工作原理
一、Mybatis工作原理
Mybatis分層框架圖
Mybatis工作原理圖
源碼分析:一般都是從helloworld入手
1、根據xml配置文件(全局配置文件mybatis-config.xml)創建一個SqlsessionFactory對象,mybatis-config.xml有數據源一些環境信息
2、sql映射文件EmployeeMapper.xml配置瞭每一個sql,以及sql的封裝規則等。
3、將sql映射文件註冊在全局配置文件中
4、寫代碼:
- 根據全局配置文件得到sqlsessionFactory
- 使用SqlSession工程進行crud、sqlseesion就代表和數據庫進行會話,用完close
- 使用sql標識告知mybatis來執行哪個sql,sql都是保存在sql映射文件中
測試類SqlSessionFactoryBuilder處打斷點
/** * 1、根據xml配置文件(全局配置文件mybatis-config.xml)創建一個SqlsessionFactory對象,mybatis-config.xml有數據源一些環境信息 * 2、sql映射文件EmployeeMapper.xml配置瞭每一個sql,以及sql的封裝規則等。 * 3、將sql映射文件註冊在全局配置文件中 * 4、寫代碼: * 4.1.根據全局配置文件得到sqlsessionFactory * 4.2.使用SqlSession工程進行crud,sqlseesion就代表和數據庫進行會話,用完close * 4.3.使用sql標識告知mybatis來執行哪個sql,sql都是保存在sql映射文件中 * * @throws IOException */ @Test public void test() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2、獲取SqlSession實例,能直接執行已經映射瞭的sql語句,selectOne:sql唯一標識,執行sql要用到的參數 SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1); System.out.println(employee); } finally { openSession.close(); } }
1、獲取SqlsessionFactory對象
XPathParser作用:用dom解析mybatis-config.xml標簽的configuration標簽
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; }
一個MappedStatement對象代表一個增刪改查標簽的詳細信息(id sqlResource等)
全局configuation的一個重要屬性MappedStatement
KonwnMappers生成一個Mapper接口的代理工廠
總結:
第一步:根據mybatis-config.xml全局配置文件創建SqlSessionFactory對象、就是把配置文件的詳細信息解析保存在瞭configuration對象中,返回包含瞭configuration的defaultSqsessionFactory對象
註意:mappedSatement對象代表一個增刪改查的詳細標簽
2、獲取sqlsession對象
mybatis-openSession
總結:
返回sqlsession的實現類defaultSqlsession對象,defaultSqlsession對象包含瞭executor和configuration,Executor(四大對象)對象會在這一步被創建
3、獲取Mapper接口代理對象(MapperProxy)
返回getMapper接口的代理對象、包含瞭SqlSession對象
4、執行增刪改查方法
查詢流程
@Test public void testInterface() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); try { EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class); Employee employee = employeeMapper.getEmpByID(1); System.out.println(employee); Employee employee2 = employeeMapper.getEmpByID(5); System.out.println(employee2); System.out.println(employee==employee2); }finally { sqlSession.close(); } }
二、Mybatis運行原理總結
1、根據配置文件(全局、SQL映射文件)初始化出configuration對象
2、創建一個defaultSqlSession對象,它裡面包含configuration和executor(根據配置文件中的defaultEXecutorType創建出對應的Executor)
3、defaultSqlSession.getMapper()獲取Mapper接口對應的MapperProxy
4、MapperProxy裡面有defaultSqlSession
5、執行增刪改查方法:
- 調用的是defaultSqlsesion的增刪改查(會調用Executor的crud)
- 會創建一個statementhandler對象(同時也會創建出parameterHandler和resultSetHandler)
- 調用StatementHandler的prepareStatement()方法進行預編譯handler.prepare()和參數設置handler.parameterize(stmt)
- 設置完成後調用StatementHandler的增刪改查方法query()
- 參數預編譯完成後使用resultSetHandler封裝結果集
註意:四大對象每個創建的時候都有一個interceptorChain.pluginAll()方法
例如StatementHandler 對象的創建
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql); statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler); return statementHandler; }
到此這篇關於詳解MyBatis工作原理的文章就介紹到這瞭,更多相關MyBatis工作原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 初次體驗MyBatis的註意事項
- MyBatis攔截器的實現原理
- 一篇文章帶你學習JAVA MyBatis底層原理
- 為什麼mybatis中的SqlSession一定要關閉
- 淺談Mybatis SqlSession執行流程