最近一直想写一个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; } }