詳解MyBatis工作原理
一、Mybatis工作原理
Mybatis分層框架圖
Mybatis工作原理圖
源碼分析:一般都是從helloworld入手
1、根據(jù)xml配置文件(全局配置文件mybatis-config.xml)創(chuàng)建一個(gè)SqlsessionFactory對(duì)象,mybatis-config.xml有數(shù)據(jù)源一些環(huán)境信息
2、sql映射文件EmployeeMapper.xml配置了每一個(gè)sql,以及sql的封裝規(guī)則等。
3、將sql映射文件注冊(cè)在全局配置文件中
4、寫代碼:
- 根據(jù)全局配置文件得到sqlsessionFactory
- 使用SqlSession工程進(jìn)行crud、sqlseesion就代表和數(shù)據(jù)庫進(jìn)行會(huì)話,用完close
- 使用sql標(biāo)識(shí)告知mybatis來執(zhí)行哪個(gè)sql,sql都是保存在sql映射文件中
測(cè)試類SqlSessionFactoryBuilder處打斷點(diǎn)
/** * 1、根據(jù)xml配置文件(全局配置文件mybatis-config.xml)創(chuàng)建一個(gè)SqlsessionFactory對(duì)象,mybatis-config.xml有數(shù)據(jù)源一些環(huán)境信息 * 2、sql映射文件EmployeeMapper.xml配置了每一個(gè)sql,以及sql的封裝規(guī)則等。 * 3、將sql映射文件注冊(cè)在全局配置文件中 * 4、寫代碼: * 4.1.根據(jù)全局配置文件得到sqlsessionFactory * 4.2.使用SqlSession工程進(jìn)行crud,sqlseesion就代表和數(shù)據(jù)庫進(jìn)行會(huì)話,用完close * 4.3.使用sql標(biāo)識(shí)告知mybatis來執(zhí)行哪個(gè)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實(shí)例,能直接執(zhí)行已經(jīng)映射了的sql語句,selectOne:sql唯一標(biāo)識(shí),執(zhí)行sql要用到的參數(shù) SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1); System.out.println(employee); } finally { openSession.close(); } }
1、獲取SqlsessionFactory對(duì)象
XPathParser作用:用dom解析mybatis-config.xml標(biāo)簽的configuration標(biāo)簽
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; }
一個(gè)MappedStatement對(duì)象代表一個(gè)增刪改查標(biāo)簽的詳細(xì)信息(id sqlResource等)
全局configuation的一個(gè)重要屬性MappedStatement
KonwnMappers生成一個(gè)Mapper接口的代理工廠
總結(jié):
第一步:根據(jù)mybatis-config.xml全局配置文件創(chuàng)建SqlSessionFactory對(duì)象、就是把配置文件的詳細(xì)信息解析保存在了configuration對(duì)象中,返回包含了configuration的defaultSqsessionFactory對(duì)象
注意:mappedSatement對(duì)象代表一個(gè)增刪改查的詳細(xì)標(biāo)簽
2、獲取sqlsession對(duì)象
mybatis-openSession
總結(jié):
返回sqlsession的實(shí)現(xiàn)類defaultSqlsession對(duì)象,defaultSqlsession對(duì)象包含了executor和configuration,Executor(四大對(duì)象)對(duì)象會(huì)在這一步被創(chuàng)建
3、獲取Mapper接口代理對(duì)象(MapperProxy)
返回getMapper接口的代理對(duì)象、包含了SqlSession對(duì)象
4、執(zhí)行增刪改查方法
查詢流程
@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運(yùn)行原理總結(jié)
1、根據(jù)配置文件(全局、SQL映射文件)初始化出configuration對(duì)象
2、創(chuàng)建一個(gè)defaultSqlSession對(duì)象,它里面包含configuration和executor(根據(jù)配置文件中的defaultEXecutorType創(chuàng)建出對(duì)應(yīng)的Executor)
3、defaultSqlSession.getMapper()獲取Mapper接口對(duì)應(yīng)的MapperProxy
4、MapperProxy里面有defaultSqlSession
5、執(zhí)行增刪改查方法:
- 調(diào)用的是defaultSqlsesion的增刪改查(會(huì)調(diào)用Executor的crud)
- 會(huì)創(chuàng)建一個(gè)statementhandler對(duì)象(同時(shí)也會(huì)創(chuàng)建出parameterHandler和resultSetHandler)
- 調(diào)用StatementHandler的prepareStatement()方法進(jìn)行預(yù)編譯handler.prepare()和參數(shù)設(shè)置handler.parameterize(stmt)
- 設(shè)置完成后調(diào)用StatementHandler的增刪改查方法query()
- 參數(shù)預(yù)編譯完成后使用resultSetHandler封裝結(jié)果集
注意:四大對(duì)象每個(gè)創(chuàng)建的時(shí)候都有一個(gè)interceptorChain.pluginAll()方法
例如StatementHandler 對(duì)象的創(chuàng)建
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; }
到此這篇關(guān)于詳解MyBatis工作原理的文章就介紹到這了,更多相關(guān)MyBatis工作原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis SQL運(yùn)行流程源碼詳解
- 使用MyBatisPlus自動(dòng)生成代碼后tomcat運(yùn)行報(bào)錯(cuò)的問題及解決方法
- Mybatis逆向工程運(yùn)行代碼實(shí)例
- Mybatis工具類JdbcTypeInterceptor運(yùn)行時(shí)自動(dòng)添加jdbcType屬性
- Mybatis源碼分析之存儲(chǔ)過程調(diào)用和運(yùn)行流程
- MyBatis緩存實(shí)現(xiàn)原理及代碼實(shí)例解析
- Mybatis Mapper接口工作原理實(shí)例解析
- 簡單了解mybatis攔截器實(shí)現(xiàn)原理及實(shí)例
- 分析mybatis運(yùn)行原理
相關(guān)文章
SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)
本文主要介紹了SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02java報(bào)錯(cuò)Cause: java.sql.SQLException問題解決
本文主要介紹了java報(bào)錯(cuò)Cause: java.sql.SQLException問題解決,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域匯總
這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08nacos中的配置使用@Value注解獲取不到值的原因及解決方案
這篇文章主要介紹了nacos中的配置使用@Value注解獲取不到值的原因分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Spring技巧之如何動(dòng)態(tài)讀取配置文件
這篇文章主要介紹了Spring技巧之如何動(dòng)態(tài)讀取配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09myBatis使用@GeneratedValue(generator?=?“...“,?strategy?=?
這篇文章主要介紹了myBatis使用@GeneratedValue(generator?=?“...“,?strategy?=?...)注解問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08