Mybatis手写Mybatis框架之XML文件解析-----Mybatis框架

package com.powernode.xml.test;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.lang.invoke.VarHandle;
import java.util.List;

public class ParseXMLByDom4jTest
{
    @Test
    public void TestParseSqlMapperXML() throws DocumentException
    {
        SAXReader saxReader = new SAXReader();
        //把我们解析到的xml文件名字传过来给它创建流
        InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("CarMapper.xml");
        //创建一个XML的Document对象
        Document document = saxReader.read(stream);
        //获取根节点的相关信息
        Element rootElement = document.getRootElement();
//        String xpath = "mapper";
//        Element e = (Element) document.selectSingleNode(xpath);
//        System.out.println(e.attributeValue("namespace"));
//        System.out.println(e.getName());
        //拿到命名空间
        String namespace = rootElement.attributeValue("namespace");
        System.out.println(namespace);
        List<Element> elements = rootElement.elements();
        //把子节点都遍历一下,获取SQL语句的mapper信息
        elements.forEach(ele ->
        {
            Element element = (Element) ele;
            //获取SQL的ID
            String id = element.attributeValue("id");
            System.out.println(id);
            //没有这个属性会返回一个null字符串
            //获取SQL对应的POJO类
            String resultType = element.attributeValue("resultType");
            System.out.println(resultType);
            //获取标签中的SQL语句
            //获取标签中的文本内容,同时去除前后空白
            String sql = element.getTextTrim();
            System.out.println(sql);
            //解析完成
            //mybatis封装了JDBC,要执行带有?的SQL语句
            sql = sql.replaceAll("#\\{[0-9A-Za-z_$]*}","?");
            System.out.println(sql);
        });
    }
    @Test
    public void TestParseMybatisConfigXML() throws DocumentException
    {
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读XML文件,我们传给它一个文件流,他会给我们创建一个文档对象Document
        InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        Document mybatisXML = reader.read(resourceAsStream);
//                System.out.println(mybatisXML.toString());
        //获取文档中的根标签,
        Element rootElement = mybatisXML.getRootElement();
        String rootEleName = rootElement.getName();
        System.out.println("根标签名字:" + rootElement.getName());
        //获取default默认的环境ID
        //里面/代表根,这个写法代表从跟下开始找configuration标签
        //然后找configuration下的environments子标签
        String xpath = "/configuration/environments";//Xpath是做标签的路径匹配的,能够让我们快速定位XML文件中的元素
        Element environments = (Element)mybatisXML.selectSingleNode(xpath);
        //因为Element是Node的子类,方法更多,使用更便捷,所以我们在这里强转成子类对象
//        System.out.println(environments);
        String defaultName = environments.attributeValue("default");
        System.out.println("默认环境的ID" + defaultName);
        //我们要获取具体的环境environment
        xpath = "/configuration/environments/environment[@id='"+ defaultName +"']";
        Element environment = (Element)mybatisXML.selectSingleNode(xpath);
        //获取environment下的transactionManager节点
        Element transactionManager = environment.element("transactionManager");
//        获取事务管理器的类型
        String transactionType = transactionManager.attributeValue("type");
        System.out.println("事务管理器类型" + transactionType);
//        获取数据源的类型
        Element dataSource = environment.element("dataSource");
        String dataSourceType = dataSource.attributeValue("type");
//        System.out.println(dataSourceType);
        //获取dataSource节点下的所有子节点
        List<Element> propertyElts = dataSource.elements();
        propertyElts.forEach(property ->
        {
            String name = property.attributeValue("name");
            String value = property.attributeValue("value");
            System.out.println("类型名" + name);
            System.out.println("值" + value);
        });
        //获取所有的Mapper标签
        xpath = "//mapper";
        //当不想从根开始获取,想从任意位置获取某个标签就需要Xpath
        //使用两个斜杠就表示不是从根开始
        List<Node> mappers = mybatisXML.selectNodes(xpath);
        //遍历所有的Mapper
        mappers.forEach(mapper ->
        {
            Element mapperEle = (Element) mapper;
            String resource = mapperEle.attributeValue("resource");
            System.out.println("源文件" + resource);
        });
    }
}
package com.powernode.xml.test;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.lang.invoke.VarHandle;
import java.util.List;

public class ParseXMLByDom4jTest
{
    @Test
    public void TestParseSqlMapperXML() throws DocumentException
    {
        SAXReader saxReader = new SAXReader();
        //把我们解析到的xml文件名字传过来给它创建流
        InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("CarMapper.xml");
        //创建一个XML的Document对象
        Document document = saxReader.read(stream);
        //获取根节点的相关信息
        Element rootElement = document.getRootElement();
//        String xpath = "mapper";
//        Element e = (Element) document.selectSingleNode(xpath);
//        System.out.println(e.attributeValue("namespace"));
//        System.out.println(e.getName());
        //拿到命名空间
        String namespace = rootElement.attributeValue("namespace");
        System.out.println(namespace);
        List<Element> elements = rootElement.elements();
        //把子节点都遍历一下,获取SQL语句的mapper信息
        elements.forEach(ele ->
        {
            Element element = (Element) ele;
            //获取SQL的ID
            String id = element.attributeValue("id");
            System.out.println(id);
            //没有这个属性会返回一个null字符串
            //获取SQL对应的POJO类
            String resultType = element.attributeValue("resultType");
            System.out.println(resultType);
            //获取标签中的SQL语句
            //获取标签中的文本内容,同时去除前后空白
            String sql = element.getTextTrim();
            System.out.println(sql);
            //解析完成
            //mybatis封装了JDBC,要执行带有?的SQL语句
            sql = sql.replaceAll("#\\{[0-9A-Za-z_$]*}","?");
            System.out.println(sql);
        });
    }
    @Test
    public void TestParseMybatisConfigXML() throws DocumentException
    {
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读XML文件,我们传给它一个文件流,他会给我们创建一个文档对象Document
        InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        Document mybatisXML = reader.read(resourceAsStream);
//                System.out.println(mybatisXML.toString());
        //获取文档中的根标签,
        Element rootElement = mybatisXML.getRootElement();
        String rootEleName = rootElement.getName();
        System.out.println("根标签名字:" + rootElement.getName());
        //获取default默认的环境ID
        //里面/代表根,这个写法代表从跟下开始找configuration标签
        //然后找configuration下的environments子标签
        String xpath = "/configuration/environments";//Xpath是做标签的路径匹配的,能够让我们快速定位XML文件中的元素
        Element environments = (Element)mybatisXML.selectSingleNode(xpath);
        //因为Element是Node的子类,方法更多,使用更便捷,所以我们在这里强转成子类对象
//        System.out.println(environments);
        String defaultName = environments.attributeValue("default");
        System.out.println("默认环境的ID" + defaultName);
        //我们要获取具体的环境environment
        xpath = "/configuration/environments/environment[@id='"+ defaultName +"']";
        Element environment = (Element)mybatisXML.selectSingleNode(xpath);
        //获取environment下的transactionManager节点
        Element transactionManager = environment.element("transactionManager");
//        获取事务管理器的类型
        String transactionType = transactionManager.attributeValue("type");
        System.out.println("事务管理器类型" + transactionType);
//        获取数据源的类型
        Element dataSource = environment.element("dataSource");
        String dataSourceType = dataSource.attributeValue("type");
//        System.out.println(dataSourceType);
        //获取dataSource节点下的所有子节点
        List<Element> propertyElts = dataSource.elements();
        propertyElts.forEach(property ->
        {
            String name = property.attributeValue("name");
            String value = property.attributeValue("value");
            System.out.println("类型名" + name);
            System.out.println("值" + value);
        });
        //获取所有的Mapper标签
        xpath = "//mapper";
        //当不想从根开始获取,想从任意位置获取某个标签就需要Xpath
        //使用两个斜杠就表示不是从根开始
        List<Node> mappers = mybatisXML.selectNodes(xpath);
        //遍历所有的Mapper
        mappers.forEach(mapper ->
        {
            Element mapperEle = (Element) mapper;
            String resource = mapperEle.attributeValue("resource");
            System.out.println("源文件" + resource);
        });
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.powernode</groupId>
    <artifactId>parse-xml-by-Dom4J</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
<!--        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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.powernode</groupId>
    <artifactId>parse-xml-by-Dom4J</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
<!--        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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值