聊聊Mybatis的初始化之建造者模式

网友投稿 538 2022-10-18

聊聊Mybatis的初始化之建造者模式

聊聊Mybatis的初始化之建造者模式

@[TOC]

聊聊Mybatis的初始化之建造者模式

Mybatis首先会加载和解析全局配置文件,调用SqlSessionFactoryBuilder.build() 方法

构建SqlSession工厂类

SqlSessionFactoryBuilder.build() 方法:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { reader.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } } public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }

构造XMLConfigBuilder对象, 调用parser.parse()方法进行xml文件的解析,返回Configuration对象,配置文件的全部配置信息都保存在Configuration对象中 调用build()方法生成DefaultSqlSessionFactory对象返回

解析xml文件

下面看一下XMLConfigBuilder的parse()方法:

public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; } 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); } }

解析xml中的properties标签,这个标签一般定义连接数据库的url 驱动 用户名密码等等,KV形式,保存在Properties类的对象中

解析xml中的settings标签,这个标签是mybatis的全局性配置,比如开启二级缓存,懒加载等,保存在Properties类中

解析xml中的typeAliases标签,这个标签用于设置类的别名,记录到TypeAliasRegistry对象

解析xml中的typeHandler标签,这个标签用于设置类型转换器,类型转换器就是实现java和jdbc之间的类型转换,记录在TypeHandlerRegistry中

解析xml中的plugins标签,这个标签可以在执行过程中的某一点进行拦截调用,自定义类实现Interceptor接口就可以,保存在Configuration对象

解析xml中的对象工厂objectFactory标签,这个标签可以用来配置自定义的对象工厂,使用的时候继承Mybatis的DefaultObjectFactory类,在创建结果对象实例的时候会被调用,这个解析了也是保存在Configuration对象中

解析xml中的对象包装工厂objectWrapperFactory标签

解析xml中的创建和缓存Reflector对象的reflectorFactory标签,可以自定义工厂类继承DefaultReflectorFactory类

解析xml中的environments标签,这个标签用来配置不同的环境,包括transactionManager事务管理器标签和dataSource数据源标签

解析xml中的databaseIdProvider标签,这个标签是数据库厂商的标识,解析的标签保存了DatabaseIdProvider对象中,调用getDatabaseId()获取databaseId来确定数据库厂商

解析mappers标签,mappers标签想必大家都比较熟悉了,就是对应xml文件

总结

本篇主要介绍了Mybatis解析全局配置文件的标签的内容,采用了建造模式通过各种Xml文件的解析来构建Configuration对象,最终创建出SqlSessionFactory工厂类,思想值得借鉴。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Saturn- J2EE应用程序开发平台
下一篇:Session和Cookie
相关文章

 发表评论

暂时没有评论,来抢沙发吧~