dom4j解析xml配置文件

参考老杜的视频

首先引入需要的依赖

<!--dom4j依赖-->
 <dependency>
     <groupId>org.dom4j</groupId>
     <artifactId>dom4j</artifactId>
     <version>2.1.3</version>
 </dependency>
 <!--jaxen依赖-->
 <dependency>
     <groupId>jaxen</groupId>
     <artifactId>jaxen</artifactId>
     <version>1.2.0</version>
 </dependency>

jaxen依赖的依赖是dom4j中用到的,所以使用dom4j的时候需要引入jaxen依赖。

项目的目录结构
在这里插入图片描述

test.xml文件是mybatis的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/dongmu"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <mappers>
            <mapper resource="sqlNapper.xml"/>
        </mappers>
    </environments>
</configuration>

sqlMapper.xml是配置sql语句的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="car">
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_ty
        pe) values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
    <select id="selectCarByCarNum" resultType="org.dongmu.pojo.Car">
        select id,car_num carNum,brand,guide_price guidePrice,produce_time,
        produceTime,car_type carType from t_car where car_num = #{carNum}
    </select>
</mapper>

编写代码解析xml文件

package org.dongmu.test;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.HashMap;
import java.util.Map;

public class Main {
    
    
    public static void main(String[] args) throws DocumentException {
    
    
//        读取xml文件,获取document对象
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("test.xml"));

//        获取environments标签的default属性的值
        Element environmentsElt = (Element) document.selectSingleNode("/configuration/environments");
//        attributeValue可以获取文档的属性值
        String defaultId = environmentsElt.attributeValue("default");
        System.out.println("environments标签的属性值是:"+defaultId);

//        获取environment标签
        Element environmentElt = (Element) environmentsElt.selectSingleNode("/configuration/environments/environment[@id='" + defaultId + "']");

//        获取事务管理器的类型
        Element transactionManager = environmentElt.element("transactionManager");
        String transactionManagerType = transactionManager.attributeValue("type");
        System.out.println("事务管理器的类型是:"+transactionManagerType);

//        获取数据源的类型
        Element dataSource = environmentElt.element("dataSource");
        Attribute dataSourceType = dataSource.attribute("type");
        System.out.println("数据源的类型是:"+dataSourceType);

//        获取数据源的信息并封装到map集合当中
        Map<String,String> dataSourceMap = new HashMap<>();
        dataSource.elements().forEach(propertyElt->{
    
    
            dataSourceMap.put(propertyElt.attributeValue("name"), propertyElt.attributeValue("value"));
        });

        System.out.println("数据源的配置信息如下:");
        dataSourceMap.forEach((k,v)-> System.out.println(k+":"+v));

//        获取sqlMapper.xml文件的路径
        Element mappersElt = (Element) document.selectSingleNode("/configuration/environments/mappers");
        mappersElt.elements().forEach(mapper-> System.out.println("获取sqlMapper.xml文件的路径:"+mapper.attributeValue("resource")));

//        解析sqlmapper.xml
        SAXReader mapperReader = new SAXReader();
        //这里的配置文件的路径就是上面获取的,这里为了处理方便直接写了sql配置文件的路径
        Document mapperDocument = mapperReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("sqlMapper.xml"));

//        获取namespace
        Element mapperElt = (Element) mapperDocument.selectSingleNode("/mapper");
        String namespace = mapperElt.attributeValue("namespace");
        System.out.println("sqlMapper的namespace属性值是:"+namespace);

//        遍历获取所有的sql
        mapperElt.elements().forEach(statementElt->{
    
    
//            获取sql标签的标签名
            String name = statementElt.getName();
            System.out.println("sql标签的标签名是:"+name);
//            如果是select语句,则获取其返回值的类型
            if ("select".equals(name)){
    
    
                String resultType = statementElt.attributeValue("resultType");
                System.out.println("select标签的返回值的类型是:"+resultType);
            }
//            获取sql语句的id
            String id = statementElt.attributeValue("id");
            System.out.println("sql语句的id是:"+id);

//            获取需要执行的sql语句
            String sql = statementElt.getTextTrim();
            System.out.println("待执行的sql语句是:"+sql);

        });
    }
}

其实在mybatis的底层就是把sql封装成了一个MappedStatement对象,这里面记录了这个sql的各种信息,包括返回值类型,sql语句,返回的结果集,是否使用缓存等等。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45401910/article/details/128367822