电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Mybatis是如何解析配置文件的

瀏覽:102日期:2023-10-20 16:01:16
緣起

經(jīng)過前面三章的入門,我們大概了解了Mybatis的主線邏輯是什么樣子的,在本章中,我們將正式進入Mybatis的源碼海洋。

Mybatis是如何解析xml的構(gòu)建Configuration

詳解Mybatis是如何解析配置文件的

我們調(diào)用new SqlSessionFactoryBuilder().build()方法的最終目的就是構(gòu)建 Configuration對象,那么Configuration何許人也?Configuration對象是一個配置管家, Configuration對象之中維護著所有的配置信息。Configuration的代碼片段如下

public class Configuration { //環(huán)境 protected Environment environment; protected boolean safeRowBoundsEnabled; protected boolean safeResultHandlerEnabled = true; protected boolean mapUnderscoreToCamelCase; protected boolean aggressiveLazyLoading; protected boolean multipleResultSetsEnabled = true; protected boolean useGeneratedKeys; protected boolean useColumnLabel = true; protected boolean cacheEnabled = true; protected boolean callSettersOnNulls; protected boolean useActualParamName = true; protected boolean returnInstanceForEmptyRow; //日志信息的前綴 protected String logPrefix; //日志接口 protected Class<? extends Log> logImpl; //文件系統(tǒng)接口 protected Class<? extends VFS> vfsImpl; //本地Session范圍 protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION; //數(shù)據(jù)庫類型 protected JdbcType jdbcTypeForNull = JdbcType.OTHER; //延遲加載的方法 protected Set<String> lazyLoadTriggerMethods = new HashSet<String>( Arrays.asList(new String[] { 'equals', 'clone', 'hashCode', 'toString' })); //默認(rèn)執(zhí)行語句超時 protected Integer defaultStatementTimeout; //默認(rèn)的執(zhí)行器 protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE; //數(shù)據(jù)庫ID protected String databaseId; //mapper注冊表 protected final MapperRegistry mapperRegistry = new MapperRegistry(this); //攔截器鏈 protected final InterceptorChain interceptorChain = new InterceptorChain(); //類型處理器 protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry(); //類型別名 protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); //語言驅(qū)動 protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry(); //mapper_id 和 mapper文件的映射 protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>( 'Mapped Statements collection'); //mapper_id和緩存的映射 protected final Map<String, Cache> caches = new StrictMap<Cache>('Caches collection'); //mapper_id和返回值的映射 protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>('Result Maps collection'); //mapper_id和參數(shù)的映射 protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>('Parameter Maps collection'); //資源列表 protected final Set<String> loadedResources = new HashSet<String>(); 未完.......}構(gòu)建MappedStatement

在Configuration中,有個mappedStatements的屬性,這是個MappedStatement對象Map的集合,其key是這個mapper的namespace+對應(yīng)節(jié)點的id,而value是一個MappedStatement對象。在構(gòu)建Configuration的時候,會去解析我們的配置文件。解析配置文件的關(guān)鍵代碼如下

private void parseConfiguration(XNode root) { try { //issue #117 read properties first propertiesElement(root.evalNode('properties')); Properties settings = settingsAsProperties(root.evalNode('settings')); loadCustomVfs(settings); loadCustomLogImpl(settings); typeAliasesElement(root.evalNode('typeAliases')); pluginElement(root.evalNode('plugins')); objectFactoryElement(root.evalNode('objectFactory')); objectWrapperFactoryElement(root.evalNode('objectWrapperFactory')); reflectorFactoryElement(root.evalNode('reflectorFactory')); settingsElement(settings); // read it after objectFactory and objectWrapperFactory issue #631 environmentsElement(root.evalNode('environments')); databaseIdProviderElement(root.evalNode('databaseIdProvider')); typeHandlerElement(root.evalNode('typeHandlers')); mapperElement(root.evalNode('mappers')); } catch (Exception e) { throw new BuilderException('Error parsing SQL Mapper Configuration. Cause: ' + e, e); }}

上訴代碼段倒數(shù)第三行mapperElement(root.evalNode('mappers'));就是解析mappers處就是把我們的mapper文件封裝成MappedStatement對象,然后保存到Configuration的mappedStatements屬性中,其中key是這個mapper的namespace+對應(yīng)節(jié)點的id,而value是一個MappedStatement對象。保存的地方關(guān)鍵代碼如下

configuration.addMappedStatement(statement);

addMappedStatement()方法代碼如下

protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>( 'Mapped Statements collection');public void addMappedStatement(MappedStatement ms) {mappedStatements.put(ms.getId(), ms);}

那么這個MappedStatement的又是何許人也?我們可以簡單的把MapperStatement理解為對sql的一個封裝,在MappedStatement中保存著一個SqlSource對象,其中就存有SQL的信息。相關(guān)代碼如下

public final class MappedStatement {private SqlSource sqlSource;}

SqlSource 代碼如下

public interface SqlSource { BoundSql getBoundSql(Object parameterObject);}

BoundSql代碼如下

public class BoundSql { private final String sql; private final List<ParameterMapping> parameterMappings;}

關(guān)于二級緩存我們在Configuration中看到了一個caches屬性

protected final Map<String, Cache> caches = new StrictMap<>('Caches collection');

這個東西的作用是什么呢?其實是關(guān)于Mybatis的二級緩存的。在解析配置文件的過程中,如果用到了二級緩存,便會把這個ID和對象也保存到configuration的caches中,相關(guān)代碼如下

public void addCache(Cache cache) { caches.put(cache.getId(), cache);}構(gòu)建SqlSessionFactory

在Configuration對象構(gòu)建完畢之后,就該依賴Configuration對象去構(gòu)建SqlSessionFactory對象了,相關(guān)代碼如下

public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config);}

我們暫且把SqlSessionFactory稱為SqlSession工廠吧,SqlSessionFactory中有兩個方法,openSession()和getConfiguration()SqlSessionFactory代碼如下

public interface SqlSessionFactory { SqlSession openSession(); //其余openSession重載方法略… Configuration getConfiguration();}構(gòu)建SqlSession

openSession()方法會返回一個SqlSession對象,SqlSession又是何許人也?SqlSession可以理解為程序與數(shù)據(jù)庫打交道的一個工具,通過它,程序可以往數(shù)據(jù)庫發(fā)送SQL執(zhí)行。SqlSession代碼如下

public interface SqlSession extends Closeable { <T> T selectOne(String statement); <T> T selectOne(String statement, Object parameter); <E> List<E> selectList(String statement); <E> List<E> selectList(String statement, Object parameter); //其余增刪查改方法略…}總結(jié)

想必你已經(jīng)明白了,Mybatis解析xml最主要的目的其實是構(gòu)建Configuration對象,這個對象中可以說包含著Mybatis的所有配置信息。其中有一個mappedStatements屬性,這是一個Map,其中key是這個mapper的namespace+對應(yīng)節(jié)點的id,而value是一個MappedStatement對象,而MappedStatement中保存著一個SqlSource對象,這個對象中保存著我們要執(zhí)行的SQL語句。

那么在下一章,我們將一起探究Mybatis是如何執(zhí)行我們的SQL語句的。

到此這篇關(guān)于詳解Mybatis是如何解析配置文件的的文章就介紹到這了,更多相關(guān)Mybatis 解析配置文件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 全自动包装机_灌装机生产厂家-迈驰包装设备有限公司 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 上海道勤塑化有限公司 | 光照全温振荡器(智能型)-恒隆仪器 | 阜阳在线-阜阳综合门户| 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 太平洋亲子网_健康育儿 品质生活| 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 都江堰招聘网-都江堰人才网 都江堰人事人才网 都江堰人才招聘网 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 安徽泰科检测科技有限公司【官方网站】 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 |