解析mybatis配置文件

最近一直想写一个mybatis 相似的ORM框架。先从模仿mybatis开始。java

先从解析mybatis配置文件开始(简化版解析部分属性,后面会完善的)node

下面是mybatis的配置文件数据库

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 配置文件的根元素 -->
<configuration>
    <!-- 属性:定义配置外在化 -->
    <properties></properties>
    <!-- 设置:定义mybatis的一些全局性设置 -->
    <settings>
        <!-- 具体的参数名和参数值 -->
        <setting name="" value=""/>
    </settings>
    <!-- 类型名称:为一些类定义别名 -->
    <typeAliases></typeAliases>
    <!-- 类型处理器:定义Java类型与数据库中的数据类型之间的转换关系 -->
    <typeHandlers></typeHandlers>
    <!-- 对象工厂 -->
    <objectFactory type=""></objectFactory>
    <!-- 插件:mybatis的插件,插件能够修改mybatis的内部运行规则 -->
    <plugins>
        <plugin interceptor=""></plugin>
    </plugins>
    <!-- 环境:配置mybatis的环境 -->
    <environments default="">
        <!-- 环境变量:能够配置多个环境变量,好比使用多数据源时,就须要配置多个环境变量 -->
        <environment id="">
            <!-- 事务管理器 -->
            <transactionManager type=""></transactionManager>
            <!-- 数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="driver"/>
                <property name="url" value="url"/>
                <property name="username" value="username"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 数据库厂商标识 -->
    <databaseIdProvider type=""></databaseIdProvider>
    <!-- 映射器:指定映射文件或者映射类 -->
    <mappers></mappers>
</configuration>

先从解析dataSource开始mybatis

package xml;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by dingshuangkun on 2017/12/2.
 */
public class XMLSingleton {
    private final String DATASOUCE="dataSource";
    private final String DRIVER="driver";
    private final String URL="url";
    private final String USERNAME="username";
    private final String PASSWORD="password";
    private final String PROPERTY="property";
    private static Document document;
    public Document getDocument() {
        return document;
    }

    private static XMLSingleton xmlSingleton = null;
    //单例模式
    private  XMLSingleton(){}
    public static XMLSingleton getInstance(){
        if(xmlSingleton == null){
            synchronized(XMLSingleton.class){
                if(xmlSingleton == null){
                    return new XMLSingleton();
                }
            }
        }
        return xmlSingleton;
    }
     //加载mybatis配置文件
    public Document load(String path)throws Exception{
        SAXReader reader = new SAXReader();
         document=  reader.read(new File(path));
         return document;
    }

    public Map<String,String> xmlParse(Document document){
        try {
            //先拿到根节点
            Element root=document.getRootElement();
            Map<String,String> nodeMap=new HashMap<>();
            //解析根节点
            Map<String,String>map= listNodes(root,nodeMap);
            return map;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public Map<String,String> listNodes(Element node,Map<String,String>map){

        if(DATASOUCE.equals(node.getName())) {
             // 取出节点对应的属性(type->POOLED) <dataSource type="POOLED"> 
             List<Attribute> list= node.attributes();
             for(Attribute a:list){
                   map.put(a.getName(),a.getValue());
             }
             // 取出子元素<property name="driver" value="driver"/>
            Iterator<Element> it=node.elementIterator();
            // 获取 name->value 存入map中
            while (it.hasNext()){
                Element element= it.next();
                if(PROPERTY.equals(element.getName())){
                    List<Attribute> attributes=element.attributes();
                    Iterator<Attribute> ita=attributes.iterator();
                    map.put(ita.next().getValue(),ita.next().getValue());
                }
            }
        }
        // 递归叶子节点
        Iterator<Element> iterator = node.elementIterator();
        while(iterator.hasNext()){
            Element e = iterator.next();
            listNodes(e,map);
        }
        return map;
    }
}
相关文章
相关标签/搜索