dom4j遍历mybatis.config.xml文件的简单demo

记录学习

正在学习mybatis,很好奇mybatis是怎么加载mybatis.config.xml的,所以做了一个小demo巩固学习

mybatis-config.xml 放在类路径下

依赖:

<!--        使用dom4j解析xml文件-->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
<!--       jaxen实现了xPath的规范,否则无法使用xPath来解析xml文件 -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>

Junit 单元测试代码:

从根路径下拿到xml的元素以及使用xPath拿到元素

import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;
/**
 *
 */

/**
 * Dom4j会将 XML 看成一个 Document 对象,将 XML 标签看成 Element 对象。
 * 读取
 * 首先,我们需要实例化 SAXReader 类,它是读取 XML 文件的核心类。调用其 read 方法读取 xml 文件,会生成一个 Document 对象。
 */

public class howToUseDom4j {
    @Test
    public void howToUse() throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));
//        可以通过document对象获取根节点等 【[Element: <configuration attributes: []/>]】
        Element rootElement = document.getRootElement();
//        通过根节点可以递归依次拿到所有的元素已经其属性
        List<Element> elements = rootElement.elements();
        getChildrenElement(elements);
    }

    public void getChildrenElement(List<Element> elements){
        for (Element element:
                elements) {
            List<Attribute> attributes = element.attributes();  // 获取当前element的属性集合
            for (Attribute attribute:
                    attributes) {
                System.out.println(element.getName()+"【"+attribute.getName()+"-->"+attribute.getValue()+"】");
            }
            List<Element> elementChildren = element.elements();
            if (elementChildren!=null){
                getChildrenElement(elementChildren);
            }

        }
    }

    /**
     * 使用xPath解析config文件
     * XPath 通过类似于文件系统路径的方式来描述 XML 文档中的节点和属性,是一种规范所以使用XPath需要导入jaxen jar包
     * 这里做一个mybatis-config.xml 中 拿到文件中的默认环境中的值的demo
     */
    @Test
    public void parseXmlByXPath() throws DocumentException {
//        1.获取xml文件的document文档对象
        Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));

//        2.创建xPath,从根标签开始查找所需语义化标签
        String rootPath ="/configuration";
        String xPath = rootPath+"/environments";

//        使用父转子之前最好进行Null判断【这里就不判断了】
//        3.默认数据库的id
        Element environments = (Element)document.selectSingleNode(xPath); // Node功能太有限了使用强制类型转换【父转子】
        String envDefaultId = environments.attribute("default").getValue(); // 获取多环境的默认id

//        4.拿到environments下的id为envDefault的 environment标签【默认数据库】
//        ps:在使用爬虫的时候经常会使用xPath,不仅仅是xml文件,html同样适用
//        /configuration/environments/environment[@id='development'] 'development' 是期望的属性值。只有当 id 属性的值等于 "development" 时,才会选中该 environment 元素。
        xPath = xPath+"/environment[@id='"+envDefaultId+"']";
        System.out.println(xPath);
        Element environment = (Element)document.selectSingleNode(xPath); // 获取
        System.out.println("默认使用的数据库环境为:"+environment.getName()+"【"+environment.attribute("id").getName()+"="+environment.attribute("id").getValue()+"】");
//        同样可以遍历environment下的属性
        List<Element> elements = environment.elements();
        getChildrenElement(elements);
    }
}

注释较少:

import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class Dom4jParseMybatisConfigTest {
    @Test
    public void testParseMybatisConfig() throws DocumentException {
//        这里使用xPath来解析mybatis-config.xml
//        1.通过SAXReader对象解析mybatis-config.xml为document对象
        Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"));

//         2.使用xPath读取到environments的default属性【默认使用的数据库环境】
        String xPath = "/configuration/environments";
        Element environmentsEle = (Element) document.selectSingleNode(xPath); // 拿到environmentsEle节点
        String envDefault = environmentsEle.attribute("default").getValue(); // 获取default的value
        System.out.println("默认数据库环境:-->"+envDefault);

//        3.找到默认的environment
// /configuration/environments/environment[@id='development'] 'development' 是期望的属性值。只有当 id 属性的值等于 "development" 时,才会选中该 environment 元素。
        xPath = "//environment[@id='"+envDefault+"']";  // 从当前元素开始 需要俩个斜杠
        Element environment = (Element)environmentsEle.selectSingleNode(xPath);

//        4.拿到事务管理器
        Element transactionMagEle = (Element) environment.selectSingleNode("//transactionManager");
        System.out.println("事务管理器:-->"+transactionMagEle.attribute("type").getValue());

//        5.拿到数据源
        Element dataSourceEle = (Element) environment.selectSingleNode("//dataSource");
        System.out.println("数据源Type:-->"+dataSourceEle.attribute("type").getValue());

//        6.依次拿到driver,url,username,password
        List<Element> elements = dataSourceEle.elements();
        elements.forEach(element -> {
            Attribute attribute = element.attribute("name");
            Attribute attributeVal = element.attribute("value");
            System.out.print(attribute.getValue()+"=");
            System.out.println(attributeVal.getValue());
        });

//        6.拿到mappers标签
            Element mappersEle  = (Element) document.selectSingleNode("/configuration/mappers");
        List<Element> mapperList = mappersEle.elements();
        mapperList.forEach(mapper->{
            Attribute resource = mapper.attribute("resource");
            System.out.println("resource="+resource.getValue());
        });
    }

    /**
     * 解析xml文件
     */
    @Test
    public void testParseXml() throws DocumentException {
        Document document = new SAXReader().read(ClassLoader.getSystemClassLoader().getResourceAsStream("DeptMapping.xml"));
//      RootElement 【由xml文件中的 <!DOCTYPE mapper 决定】
        Element mapper = document.getRootElement();
        List<Element> elements = mapper.elements();
        for (Element element:
        elements) {
            System.out.println("mapper的id="+element.attribute("id").getValue());
            System.out.println("SQL="+element.getTextTrim());
        }
    }
}

howToUse单元测试输出的结果

environments【default-->development】
environment【id-->development】
transactionManager【type-->JDBC】
dataSource【type-->POOLED】
property【name-->driver】
property【value-->com.mysql.cj.jdbc.Driver】
property【name-->url】
property【value-->jdbc:mysql://localhost:3306/company】
property【name-->username】
property【value-->root】
property【name-->password】
property【value-->123456】
environment【id-->mybatisDb】
transactionManager【type-->JDBC】
dataSource【type-->UNPOOLED】
property【name-->driver】
property【value-->com.mysql.cj.jdbc.Driver】
property【name-->url】
property【value-->jdbc:mysql://localhost:3306/curd_servlet】
property【name-->username】
property【value-->root】
property【name-->password】
property【value-->123456】
mapper【resource-->DeptMapping.xml】

parseXmlByXPath单元测试输出的结果

/configuration/environments/environment[@id='development']
默认使用的数据库环境为:environment【id=development】
transactionManager【type-->JDBC】
dataSource【type-->POOLED】
property【name-->driver】
property【value-->com.mysql.cj.jdbc.Driver】
property【name-->url】
property【value-->jdbc:mysql://localhost:3306/company】
property【name-->username】
property【value-->root】
property【name-->password】
property【value-->123456】

猜你喜欢

转载自blog.csdn.net/lfeishumomol/article/details/132545134
今日推荐