Une simple démo de dom4j traversant le fichier mybatis.config.xml

enregistrer l'apprentissage

J'apprends mybatis et je suis très curieux de savoir comment mybatis charge mybatis.config.xml, j'ai donc fait une petite démo pour consolider mon apprentissage.

mybatis-config.xml est placé sur le chemin de classe

compter sur:

<!--        使用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>

Code de test unitaire Junit :

Récupérez les éléments XML à partir du chemin racine et utilisez xPath pour obtenir les éléments

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);
    }
}

Moins de commentaires :

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());
        }
    }
}

Comment utiliser les résultats des tests unitaires

environnements[par défaut-->développement]
environnement[id-->développement]
transactionManager[type-->JDBC]
dataSource[type-->POOLED]
propriété[nom-->pilote]
propriété[valeur-->com.mysql. cj.jdbc.Driver】
propriété[nom-->url]
propriété[valeur-->jdbc:mysql://localhost:3306/company]
propriété[nom-->nom d'utilisateur]
propriété[valeur-->root]
propriété[ nom-->mot de passe】
propriété[valeur-->123456]
environnement[id-->mybatisDb]
transactionManager[type-->JDBC]
dataSource[type-->UNPOOLED]
propriété[nom-->driver]
propriété[valeur- ->com.mysql.cj.jdbc.Driver】
propriété【nom-->url】
propriété【valeur-->jdbc:mysql://localhost :3306/curd_servlet】
propriété[nom-->nom d'utilisateur]
propriété[valeur-->racine]
propriété[nom-->mot de passe]
propriété[valeur-->123456]
mapper[ressource-->DeptMapping.xml]

résultats de sortie du test unitaire parseXmlByXPath

/configuration/environments/environment[@id='development']
默认使用的数据库环境为:environment【id=development】
transactionManager【type-->JDBC】
dataSource【type-->POOLED】
propriété【nom-->pilote 】
propriété【valeur-->com.mysql.cj.jdbc.Driver】
propriété【nom-->url】
propriété【valeur-->jdbc:mysql://localhost:3306/company】
propriété【nom-->nom d'utilisateur 】
propriété【valeur-->root】
propriété【nom-->mot de passe】
propriété【valeur-->123456】

Guess you like

Origin blog.csdn.net/lfeishumomol/article/details/132545134