dom4j 解析 mybatis mapper xml 文件

news2024/12/24 9:15:05

01: 

CarMapper.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="car">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type)
        values
            (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>

</mapper>

package com.wsd;

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.util.List;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseMapperXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("CarMapper.xml");

        Document document = null;

        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取根节点 mapper标签
            String xpath = "/mapper";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element mapperElement = (Element) document.selectSingleNode(xpath);
            System.out.println(mapperElement);
            //获取属性值
            String namespace = mapperElement.attributeValue("namespace");
            System.out.println(namespace);
            
        }
        catch ( DocumentException e){
            e.printStackTrace();
        }

    }


}

 

02:

Car pojo :

package com.wsd.pojo;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-17 21:53
 **/
public class Car {

    private Long id;
    private String carNum;
    private String brand;
    private Double guidePrice;
    private String produceTime;
    private String carType;

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", carNum='" + carNum + '\'' +
                ", brand='" + brand + '\'' +
                ", guidePrice=" + guidePrice +
                ", produceTime='" + produceTime + '\'' +
                ", carType='" + carType + '\'' +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCarNum() {
        return carNum;
    }

    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getGuidePrice() {
        return guidePrice;
    }

    public void setGuidePrice(Double guidePrice) {
        this.guidePrice = guidePrice;
    }

    public String getProduceTime() {
        return produceTime;
    }

    public void setProduceTime(String produceTime) {
        this.produceTime = produceTime;
    }

    public String getCarType() {
        return carType;
    }

    public void setCarType(String carType) {
        this.carType = carType;
    }
}

 

 CarMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="car">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type)
        values
            (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>

    <select id="selectCarAll" resultType="com.wsd.pojo.Car">
        <!--记得使用as起别名,让查询结果的字段名和java类的属性名对应上-->
        select
        brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
        from
        t_car
    </select>

</mapper>
package com.wsd;

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.util.List;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseMapperXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("CarMapper.xml");

        Document document = null;

        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取根节点 mapper标签
            String xpath = "/mapper";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element mapperElement = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String namespace = mapperElement.attributeValue("namespace");

            //获取所有 子 元素
            List<Element> elements = mapperElement.elements();

            //遍历
            elements.forEach(
                    element -> {
                        //获取 id 属性
                        String id = element.attributeValue("id");
                        System.out.println("id = " + id);

                        //获取 resultType 属性,没有该属性 返回 null
                        String resultType = element.attributeValue("resultType");
                        System.out.println("resultType = " + resultType);

                        //获取标签的文本内容(sql语句),并且去除前后的空格
                        String sql = element.getTextTrim();
                        System.out.println("sql :" +  sql);

                    }
            );

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }

    }

}

 

 

 

"C:\Program Files\Java\jdk-17\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 -Didea.launcher.port=62271 "-Didea.launcher.bin.path=C:\Minecloud\IDEA_2019\IntelliJ IDEA 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Minecloud\IDEA_2019\IntelliJ IDEA 2019.1\lib\idea_rt.jar;C:\Minecloud\IDEA_2019\IntelliJ IDEA 2019.1\plugins\junit\lib\junit-rt.jar;C:\Minecloud\IDEA_2019\IntelliJ IDEA 2019.1\plugins\junit\lib\junit5-rt.jar;C:\Minecloud\IDEA_workspace\spring_learn\parsexml\target\test-classes;C:\Minecloud\IDEA_workspace\spring_learn\parsexml\target\classes;C:\Minecloud\maven_3.9\apache-maven-3.9.0\repo\org\dom4j\dom4j\2.1.3\dom4j-2.1.3.jar;C:\Minecloud\maven_3.9\apache-maven-3.9.0\repo\jaxen\jaxen\1.2.0\jaxen-1.2.0.jar;C:\Minecloud\maven_3.9\apache-maven-3.9.0\repo\junit\junit\4.13.2\junit-4.13.2.jar;C:\Minecloud\maven_3.9\apache-maven-3.9.0\repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.application.AppMainV2 com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.wsd.TestXml,testParseMapperXml
id = insertCar
resultType = null
sql :insert into t_car (id,car_num,brand,guide_price,produce_time,car_type) values (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
id = selectCarAll
resultType = com.wsd.pojo.Car
sql :select brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType from t_car

Process finished with exit code 0
 

03:

package com.wsd;

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.util.List;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseMapperXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("CarMapper.xml");

        Document document = null;

        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取根节点 mapper标签
            String xpath = "/mapper";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element mapperElement = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String namespace = mapperElement.attributeValue("namespace");

            //获取所有 子 元素
            List<Element> elements = mapperElement.elements();

            //遍历
            elements.forEach(
                    element -> {
                        //获取 id 属性
                        String id = element.attributeValue("id");
                        System.out.println("id = " + id);

                        //获取 resultType 属性,没有该属性 返回 null
                        String resultType = element.attributeValue("resultType");
                        System.out.println("resultType = " + resultType);

                        //获取标签的文本内容(sql语句),并且去除前后的空格
                        String mapperSql = element.getTextTrim();
                        System.out.println("mapperSql :" +  mapperSql);

                        //将 #{} 替换为 ?,"#\\{[0-9A-Za-z_$]*}" 是匹配 #{} 的正则表达式
                        String preSql = mapperSql.replaceAll("#\\{[0-9A-Za-z_$]*}", "?");
                        System.out.println("preSql    :" + preSql);

                    }
            );

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }

    }
}

 

id = insertCar
resultType = null
mapperSql :insert into t_car (id,car_num,brand,guide_price,produce_time,car_type) values (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
preSql    :insert into t_car (id,car_num,brand,guide_price,produce_time,car_type) values (null,?,?,?,?,?)
id = selectCarAll
resultType = com.wsd.pojo.Car
mapperSql :select brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType from t_car
preSql    :select brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType from t_car
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录 回溯算法 Java

文章目录 组合&#xff08;*中等&#xff09;77. 组合&#xff08;*中等&#xff09;17. 电话号码的字母组合&#xff08;中等&#xff09;39. 组合总和&#xff08;中等&#xff09;40. 组合总和II&#xff08;中等&#xff09;216. 组合总和||| 分割&#xff08;*中等&#x…

【王道操作系统】内存管理

内存管理概念 1.C 2.D 存储保护的作用&#xff1a;保证各道作业在各自的存储空间内运行&#xff0c;互不干扰 实现虚拟内存管理需要请求分页&#xff08;请求分段、请求段页&#xff09;等技术的支持&#xff0c;故需要硬件支持&#xff0c;比如页表机制、中断机构、地址变换…

【五子棋实战】第1章 项目架构与开发思路

【五子棋实战】第1章 项目总览 前言 ## 项目技术栈 ## 项目可配置性 博客目录 项目预览 项目代码获取 项目架构 ## 架构&#xff1a;前端页面 算法接口 ## 前端页面 ## 算法接口 开发思路 前言 五子棋是一种古老而受欢迎的棋类游戏&#xff0c;本博客将介绍如何使用…

Matplotlib-直方图、箱型图

1. 直方图 hist函数来创建一个直方图。下面是对各个参数的解释&#xff1a; x&#xff1a;要绘制直方图的数据序列。bins&#xff1a;指定直方图的边界范围和间隔。这里使用range(40, 110, 6)表示边界从40到110&#xff0c;间隔为6。facecolor&#xff1a;直方图的填充颜色。…

unity UGUI源码分析(4)Text与TextMeshPro

这一篇博客用于分析Text的内容的更新机制&#xff0c;并分析text mesh pro。 首先我们分析Text的文字是如何渲染出来的。 PupulateWithErrors方法会根据字符串生成顶点数据。其实Text会根据所给定的字符串生成相关的图集&#xff0c;然后对图集进行采样就可以渲染出文字了。由…

【五子棋实战】第3章 算法包装成第三方接口

【五子棋实战】第3章 算法包装成第三方接口 使用Flask开放接口 ## 定义接口输入 ## 开放接口、跨域配置、数据解析 数据预处理 ## 数据检查与异常捕获 ## 预处理数据 ## 定义接口输出 开启接口 继续学习下一篇实战&#xff01; 我们在上一章实现了博弈树负值极大alpha…

最适合入门的100个深度学习实战项目

&#x1f6a8;注意&#x1f6a8;&#xff1a;最近经粉丝反馈&#xff0c;发现有些订阅者将此专栏内容进行二次售卖&#xff0c;特在此声明&#xff0c;本专栏内容仅供学习&#xff0c;不得以任何方式进行售卖&#xff0c;未经作者许可不得对本专栏内容行使发表权、署名权、修改…

Linux系统安装nginx+入门笔记

安装过程 1.加载wget命令 yum install wget 2.拉取安装包 wget https://nginx.org/download/nginx-1.16.1.tar.gz 3.解压安装包 tar -zxvf nginx-1.16.1.tar.gz 4.执行这个命令自动配置一下 5.编译安装 make make install 6.查看nginx安装的位置 whereis nginx 7.…

基于Python的反爬虫技术的研究设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

链表刷题(4~8)

目录 反转链表 返回中间节点 倒数k个节点 链表分割 判断回文 反转链表 单链表刷题时我们遇到过一个反转链表&#xff0c;那时我们采用的是头插的方式达到反转的效果&#xff0c;那能不能把指针反过来呢&#xff1f;答案是可以的。 这里用三个指针是为了记录后面节点的数据&…

SpringBoot+Vue 的智慧养老系统(Java 项目,附源码,数据库)

作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&#xff0c;springboot等等项…

Jira 8.4.1在Windows环境下的安装和配置

一. Jira安装的环境准备 1.JDK1.8的下载和安装 Jira的运行是依赖java环境的&#xff0c;也就是说需要安装JDK并且要是1.8以上版本。(网上搜一下教程) 2.MySQL数据库的下载和安装(网上搜一下教程) 数据库版本&#xff1a;MySQL5.6&#xff0c;版本太高有时会出现连接不到的…

从双目标定到立体匹配:pyton实践指南

文章目录 前言标定立体匹配文章已经同步更新在3D视觉工坊啦&#xff0c;原文链接如下&#xff1a; 前言 立体匹配是计算机视觉中的一个重要领域&#xff0c;旨在将从不同角度拍摄的图像匹配起来&#xff0c;以创建类似人类视觉的3D效果。实现立体匹配的过程需要涉及许多步骤&a…

华为OD机试真题B卷 Java 实现【统计每个月兔子的总数】,附详细解题思路

一、题目描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例如&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…

dvwa靶场通关(七)

第七关&#xff1a;SQL Injection&#xff08;sql注入&#xff09; low 我们输入 1,出现报错信息&#xff0c;根据报错信息可知&#xff0c;查询语句是单引号闭合的字符型 接着判断字段数 1 order by 3# 报错 1 order by 2# 正常 所以字段数就是2 利用联合查询爆出数据库名…

农村小子背井离乡北漂的这些年

人生虽不尽人意、生活也并不完美、可生活依旧很美 1. 写在前面 由于工作变动及其他种种原因吧&#xff0c;很长的一段时间内没有再去写文章。始于2019年初夏&#xff0c;止于2020年初冬&#xff0c;再次落笔于2023年的夏季。恰好今天是端午节&#xff0c;祝大家端午安康 白驹过…

springboot第28集:springboot一些概念

DataScopeAspect 数据过滤处理 此切面在执行带有ControllerDataScope注解的方法之前进行数据权限过滤。首先获取当前登录用户&#xff0c;然后判断当前用户是否为超级管理员。如果不是超级管理员&#xff0c;则获取权限字符&#xff0c;默认使用上下文中的权限字符。接下来&am…

【计算机组成原理】2、二进制和十六进制转换,进制相减、内存地址偏移计算与容量计算

文章目录 一、进制转换1.1 二进制转十六进制1.2 十六进制转二进制 二、进制相减2.1 十六进制 三、内存地址偏移计算3.1 根据首末地址&#xff0c;求存储容量3.2 根据末地址 和 存储容量&#xff0c;求首地址 一、进制转换 1.1 二进制转十六进制 因 2 4 16 2^416 2416&#…

leetcode300. 最长递增子序列(动态规划-java)

最长递增子序列 leetcode300. 最长递增子序列题目描述解题思路代码演示: 二分法改进(N * logN)动态规划专题 leetcode300. 最长递增子序列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/longest-increasing-subsequenc…

C++标准输出

C将输入和输出看作字节流&#xff0c;输入时&#xff0c;程序从输入流中抽取字节&#xff0c;输出时&#xff0c;程序将自己插入到输出流中&#xff0c;流充当了程序与流源或流目标之间的桥梁&#xff0c;也就是说C通过流与硬件&#xff0c;文件相关联&#xff0c;流赋予了C程序…