首页 » Web前端 » phpSQLBuilder技巧_Mybatis源码一SqlSessionFactoryBuilder获得设备文件

phpSQLBuilder技巧_Mybatis源码一SqlSessionFactoryBuilder获得设备文件

访客 2024-11-19 0

扫一扫用手机浏览

文章目录 [+]

//读取conf.xml Reader reader = Resources.getResourceAsReader("conf.xml"); //创建会话工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);复制代码SqlSessionFactoryBuilder的源码

public SqlSessionFactory build(Reader reader) { return build(reader, null, null); }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. } } }复制代码

SqlSessionFactoryBuilder只有一堆重载的build方法,除了build(Configuration)方法,其他方法的参数都是输入流,终极由build(Configuration)方法天生SqlSessionFactory工具,在个中会天生一个XMLConfigBuilder工具,下面来看如何构建Configuration工具。

XMLConfigBuilder解析配置文件

XMLConfigBuilder类名就可以看出,这是用来解析XML配置文件的类,其父类为BaseBuilder。

phpSQLBuilder技巧_Mybatis源码一SqlSessionFactoryBuilder获得设备文件

public class XMLConfigBuilder extends BaseBuilder{...}复制代码XMLConfigBuilder父类BaseBuilder

个中BaseBuilder还包含了许多子类,这些子类都是用来解析MyBatis各个配置文件,他们通过BaseBuilder父类共同掩护一个全局的Configuration工具, XMLConfigBuilder的浸染便是解析全局配置文件,调用BaseBuilder其他子类解析其他配置文件,天生终极的Configuration工具。
值得把稳的是,这里BaseBuilder布局方法参数是一个初始化的Configuration工具,Configuration工具初始化的时候,内置的别名注册器TypeAliasRegistry注册了默认的别名

phpSQLBuilder技巧_Mybatis源码一SqlSessionFactoryBuilder获得设备文件
(图片来自网络侵删)

public Configuration() { typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class); typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class); typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class); typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class); typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class); typeAliasRegistry.registerAlias("FIFO", FifoCache.class); typeAliasRegistry.registerAlias("LRU", LruCache.class); typeAliasRegistry.registerAlias("SOFT", SoftCache.class); typeAliasRegistry.registerAlias("WEAK", WeakCache.class); typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class); typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class); typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class); typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class); typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class); typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class); typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class); typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class); typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class); typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class); typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class); typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class); languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class); languageRegistry.register(RawLanguageDriver.class); }XPathParser类解析config.xml文件

public XMLConfigBuilder(Reader reader, String environment, Properties props) { this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props); }复制代码

上述代码可以创造在SqlSessionFactoryBuilder.build方法中,new XMLConfigBuilder类时 environment和props值为null,以是,我们紧张看new XPathParser方法

字段

private Document document ; // Document 工具private boolean validation; //是否开启验证private EntityResolver entityResolver ; // 用于加载本地DTD 文件pruvate Properties variables ; // mybatis -config.xml 中< propteries > 标签定义的键位对凑集private XPath xpath ; // XPath 工具复制代码Document(Document工具) Document 工具代表全体 XML 文档,是一棵文档树的根,可为我们供应对文档数据的最初(或最顶层)的访问入口。
EntityResolver (加载本地的DTD文件) 如果解析mybatis-config.xml 配置文件,默认联网加载http://mybatis.org/dtd/mybatis-3- config.dtd 这个DTD 文档,当网络比较慢时会导致验证过程缓慢。
在实践中每每会提前设置EntityResolver 接口工具加载本地的DTD 文件,从而避免联网加载DTD文件。
XPath (XPath工具) XPath 是一种为查询XML 文档而设计的措辞,它可以与DOM 解析办法合营利用,实现对XML 文档的解析。
validation(是否开启验证标记) 该标记表示设置解析器在解析文档的时候是否校验文档,在创建DocumentBuilderFactory实例工具时进行设置。
variables(配置参数凑集)。
对应配置文件中节点下定义的键值对凑集,包括通过url或者resource读取的键值对凑集。
布局方法

XPathParser类供应了一系列的布局函数,所有的布局函数内部都通过通用的commonConstructor()方法实现对干系字段属性的初始化,部分布局函须要通过createDocument()方法把指定的数据源转换成Document工具。
大致可以分为四类

以Document作为参数以InputStream作为参数以Reader作为参数以String作为参数

public XPathParser(Reader reader, boolean validation, Properties variables, EntityResolver entityResolver) { commonConstructor(validation, variables, entityResolver); this.document = createDocument(new InputSource(reader)); }复制代码createDocument方法

该方法紧张实现根据输入源创建Document工具。
创建Document工具的过程如下

创建DocumentBuilderFactory工具,并设置干系参数。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();创建DocumentBuilder工具,并设置干系参数。
DocumentBuilder builder = factory.newDocumentBuilder();解析Document工具。
builder.parse(inputSource);

详细代码如下:

private Document createDocument(InputSource inputSource) { // important: this must only be called AFTER common constructor try { //创建DocumentBuilderFactory实例工具 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //设置是否启用DTD验证 factory.setValidating(validation); //设置是否支持XML名称空间 factory.setNamespaceAware(false); //设置解析器是否忽略注释 factory.setIgnoringComments(true); / 设置必须删除元素内容中的空格(有时也可以称作“可忽略空格”,请参阅 XML Rec 2.10)。
把稳,只有在空格直接包含在元素内容中,并且该元素内容是只有一个元素的内容模式时, 才能删除空格(请参阅 XML Rec 3.2.1)。
由于依赖于内容模式,因此此设置哀求解析器处于验证模式。
默认情形下,其值设置为 false。
/ factory.setIgnoringElementContentWhitespace(false); / 指定由此代码天生的解析器将把 CDATA 节点转换为 Text 节点,并将其附加到相邻(如果有)的 Text 节点。
默认情形下,其值设置为 false。
/ factory.setCoalescing(false); / 指定由此代码天生的解析器将扩展实体引用节点。
默认情形下,此值设置为 true。
/ factory.setExpandEntityReferences(true); //创建DocumentBuilder实例工具 DocumentBuilder builder = factory.newDocumentBuilder(); //指定利用 EntityResolver 解析要解析的 XML 文档中存在的实体。
将其设置为 null 将会导致底层实现利用其自身的默认实现和行为。
builder.setEntityResolver(entityResolver); //指定解析器要利用的 ErrorHandler。
将其设置为 null 将会导致底层实现利用其自身的默认实现和行为。
builder.setErrorHandler(new ErrorHandler() { @Override public void error(SAXParseException exception) throws SAXException { throw exception; } @Override public void fatalError(SAXParseException exception) throws SAXException { throw exception; } @Override public void warning(SAXParseException exception) throws SAXException { } }); return builder.parse(inputSource); } catch (Exception e) { throw new BuilderException("Error creating document instance. Cause: " + e, e); } }
commonConstructor方法

布局器通用代码块,用于初始化validation、entityResolver、variables、xpath等属性字段。
个中,validation、entityResolver、variables三个参数通过参数通报过来;xpath属性是通过XPathFactory创建。
详细代码片段:

private void commonConstructor(boolean validation, Properties variables, EntityResolver entityResolver) { this.validation = validation; this.entityResolver = entityResolver; this.variables = variables; XPathFactory factory = XPathFactory.newInstance(); this.xpath = factory.newXPath(); }复制代码evalXXX方法

XPathParser类供应了一系列的evalXXX方法,见下图,这些方法紧张用于解析boolean 、short、long 、int 、String 、Node等类型的信息。
底层是通过evaluate()方法实现。
个中,evalString()方法中,会通过调用PropertyParser.parse()处理占位符;evalNode()、evalNodes()方法中,根据解析结果会创建XNode工具。
详细创建过程,在XNode类源码剖析中学习。

XNode类

XNode类对应了配置文件中一个元素节点的信息。

//org.w3c.dorn.Node工具 private final Node node; //Node节点名称 private final String name; //节点的内容 private final String body; //节点属性凑集 private final Properties attributes; //配置文件中<properties>节点下定义的键位对 private final Properties variables; //XPathParser工具,当前XNode工具由此XPathParser工具天生 private final XPathParser xpathParser;复制代码XMLConfigBuilder.parse()方法

此时我们已经得到了XMLConfigBuilder工具,再看SqlSessionFactoryBuilder的build方法,将XMLConfigBuilder实例工具parser调用parser()方法得到的Configuration实例工具config作为参数,调用SqlSessionFactory接口的实现类DefaultSqlSessionFactory布局出SqlSessionFactory工具。
XMLConfigBuilder工具在调用parser()方法时,会读出所有所有配置文件,将配置文件解析后保存在Configuration工具中。

再查看build方法,参数为Configuration,可以预测处parse方法是返回一个Configuration工具

parse方法代码:

public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //参数是<configuraton>标签根节点 parseConfiguration(parser.evalNode("/configuration")); return configuration; }复制代码

可以创造这里通过parseConfiguration方法利用之前创建的Xparser类,把XML全局配置文件中每一个节点的信息都读取出来,保存在一个Configuration工具中,Configuration分别对以下内容做出了初始化:

private void parseConfiguration(XNode root) { try { //issue #117 read properties first propertiesElement(root.evalNode("properties")); Properties settings = settingsAsProperties(root.evalNode("settings")); loadCustomVfs(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); } }复制代码properties 属性settings 设置typeAliases 类型别名typeHandlers 类型处理器objectFactory 工具工厂plugins 插件environments 环境databaseIdProvider 数据库厂牌号识mappers 映射器

到了这里,已经可以开始加载配置文件了

总的来说,大概便是这个样子

以为文章不错 点个关注哦

相关文章

QQ伪装黑客代码大全技术与风险警示

网络安全问题日益凸显。QQ作为一种流行的社交工具,成为了黑客攻击的主要目标之一。本文将针对QQ伪装黑客代码大全进行深入剖析,揭示其...

Web前端 2025-03-02 阅读1 评论0