MyBatis XPathParser解析器使用范例详解

MyBatis是优秀的开源数据库框架,本菜鸟抱着学习的态度,通过《MyBatis技术内幕》一书来进行MyBatis 的学习。

MyBatis 的基础支撑层使用XPathParser来实现XML的解析,纸上得来终觉浅,本菜鸟决定亲自简单实践下XPathParser的使用,并在此做下备忘;

首先,XPathParser封装了XML的document对象,其构造方法较多,个人选了以下几个方法:

第一个是将XML内容作为一个字符串输入

  public XPathParser(String xml) {
    commonConstructor(false, null, null);
    this.document = createDocument(new InputSource(new StringReader(xml)));
  }

接下来是添加一个是否进行校验的标志位

  public XPathParser(String xml, boolean validation) {
    commonConstructor(validation, null, null);
    this.document = createDocument(new InputSource(new StringReader(xml)));
  }

再接下来,是添加一个Properties 来作为配置值方便解析(后面写测试方法,采用此构造方法)

  public XPathParser(String xml, boolean validation, Properties variables) {
    commonConstructor(validation, variables, null);
    this.document = createDocument(new InputSource(new StringReader(xml)));
  }

我们先准备一份XML文件,是从网上抄来的,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入外部资源文件 -->
    <properties resource="jdbc.properties"></properties>
    <!-- 设置驼峰匹配 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!-- 设置包扫描(别名) -->
    <typeAliases>
        <package name="cn.itcast.pojo"/>
    </typeAliases>
    <!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 配置连接信息 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

我们构造一个Properties对象,作为构造方法的入参:

Properties properties = new Properties();
properties.put("jdbc.driverClass", "jdbc.driverClass");
properties.put("jdbc.url","hahaha");

构造方法如下(对付看吧)

XPathParser xPathParser = new XPathParser("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n" +
                "        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n" +
                "<configuration>\n" +
                "    <!-- 引入外部资源文件 -->\n" +
                "    <properties resource=\"jdbc.properties\"></properties>\n" +
                "    <!-- 设置驼峰匹配 -->\n" +
                "    <settings>\n" +
                "        <setting name=\"mapUnderscoreToCamelCase\" value=\"true\"/>\n" +
                "    </settings>\n" +
                "    <!-- 设置包扫描(别名) -->\n" +
                "    <typeAliases>\n" +
                "        <package name=\"cn.itcast.pojo\"/>\n" +
                "    </typeAliases>\n" +
                "    <!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->\n" +
                "    <environments default=\"development\">\n" +
                "        <environment id=\"development\">\n" +
                "            <transactionManager type=\"JDBC\"/>\n" +
                "            <dataSource type=\"POOLED\">\n" +
                "                <!-- 配置连接信息 -->\n" +
                "                <property name=\"driver\" value=\"${jdbc.driverClass}\"/>\n" +
                "                <property name=\"url\" value=\"${jdbc.url}\"/>\n" +
                "                <property name=\"username\" value=\"${jdbc.username}\"/>\n" +
                "                <property name=\"password\" value=\"${jdbc.password}\"/>\n" +
                "            </dataSource>\n" +
                "        </environment>\n" +
                "    </environments>\n" +
                "    <!-- 配置映射文件:用来配置sql语句和结果集类型等 -->\n" +
                "    <mappers>\n" +
                "        <mapper resource=\"UserMapper.xml\"/>\n" +
                "    </mappers>\n" +
                "</configuration>", false, properties);

接下来,我们需要针对准备的xml文件,来设计XPath表达式,XPath表达式可以在此处学习

        String string1 = xPathParser.evalString("//typeAliases/package/@name"); //typeAliases下package标签的name值
        String string2 = xPathParser.evalString("//environments/environment/dataSource/@type"); //environments下environment下dataSource标签的type值
        List<XNode> xNodes = xPathParser.evalNodes("//dataSource/property/@value"); //dataSource下property下的所有value值

前两个输出在此不做描述,我们遍历xNodes ,可以得到Body的值为:

jdbc.driverClass

hahaha

${jdbc.username}

${jdbc.password}

我们可以发现,jdbc.driverClass,hahaha,都是我们在入参的Properties中配置的值,因此可以通过${},来取出value,而对于Properties对象中不存在的值,XPathParser只能取对应的字符串作为value(${jdbc.password}等)。

希望通过学习优秀开源框架的工具,可以在以后自身工作的开发中学以致用,更好滴解决实际问题,以后本菜会多多实践优秀框架为我们创造的工具,丰富自己的武器库。

到此这篇关于MyBatis XPathParser解析器使用范例详解的文章就介绍到这了,更多相关MyBatis XPathParser内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis-Plus 动态表名SQL解析器的实现

    一.引言 先来说下动态名表在什么场景下需要使用呢? 拿小编的实际项目来说,小编公司手里掌握着国内各个部分地区的医院患者数据,那么一个医院的患者的数据流量肯定是很大的,这个时候如果全部放在同一张表中,那么可想而知数据量的庞大.所以数据库设计的时候可以一家医院对应一张表,分开来存储,表中的列名都是一样的,只是表名不同. 或者还可以做日志的存储,日志数据量也是很大的,可以分一个月对应一张表,比如:log_201907.log_201908等等之类的. 二.具体实现 动态表名SQL解析器也是基于MP分页

  • MyBatis XPathParser解析器使用范例详解

    MyBatis是优秀的开源数据库框架,本菜鸟抱着学习的态度,通过<MyBatis技术内幕>一书来进行MyBatis 的学习. MyBatis 的基础支撑层使用XPathParser来实现XML的解析,纸上得来终觉浅,本菜鸟决定亲自简单实践下XPathParser的使用,并在此做下备忘: 首先,XPathParser封装了XML的document对象,其构造方法较多,个人选了以下几个方法: 第一个是将XML内容作为一个字符串输入 public XPathParser(String xml) {

  • Python网页解析器使用实例详解

    python 网页解析器 1.常见的python网页解析工具有:re正则匹配.python自带的html.parser模块.第三方库BeautifulSoup(重点学习)以及lxm库. 2.常见网页解析器分类 (1)模糊匹配 :re正则表达式即为字符串式的模糊匹配模式: (2)结构化解析: BeatufiulSoup.html.parser与lxml,他们都以DOM树结构为标准,进行标签结构信息的提取. 3.DOM树解释:即文档对象模型(Document Object Model),其树形标签结

  • Mybatis自定义拦截器和插件开发详解

    前言 在Spring中我们经常会使用到拦截器,在登录验证.日志记录.性能监控等场景中,通过使用拦截器允许我们在不改动业务代码的情况下,执行拦截器的方法来增强现有的逻辑.在mybatis中,同样也有这样的业务场景,有时候需要我们在不侵入原有业务代码的情况下拦截sql,执行特定的某些逻辑.那么这个过程应该怎么实现呢,同样,在mybatis中也为开发者预留了拦截器接口,通过实现自定义拦截器这一功能,可以实现我们自己的插件,允许用户在不改动mybatis的原有逻辑的条件下,实现自己的逻辑扩展. 本文将按

  • mybatis动态sql实现逻辑代码详解

    目录 1.xml文件读取 2.xml 文件解析 mybatis通过将sql配置xml文件中,通过解析xml动态标签来实现动态sql 如下样例 xml文件 <?xml version = "1.0" ?> <!DOCTYPE script SYSTEM "script-1.0.dtd"> <script namespace="user"> <common id="commonOrder"

  • MyBatis Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • Mybatis velocity脚本的使用教程详解(推荐)

    可能很多童鞋都还不是很清楚在mybatis可以使用各种脚本语言来定义Mapper文件里面的动态SQL:目前mybatis支持的脚本语言有XML(默认的):Velocity和Freemarker三种.使用不同的脚本语言来完成Mapper文件的编写,第一是使用自己熟悉的脚本语言,第二是能够定义更多丰富的自定义指令来简化Mapper的开发,关于MyBatis支持脚本的原理分析,自定义脚本指令后面再写文章分析,本文先介绍mybatis中velocity脚本的使用方式. mybatis-velocity项

  • Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

  • Spring MVC 拦截器 interceptor 用法详解

    Spring MVC-拦截器 今天就是把有关拦截器的知识做一个总结. 1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日志.判断用户是否登录等. 要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置.通常拦截器类可以通过两种方式来定义. 1.通过实现HandlerInterceptor接口,或继承Han

  • SpringBoot之HandlerInterceptor拦截器的使用详解

    前言 平常项目开发过程中,会遇到登录拦截,权限校验,参数处理,防重复提交等问题,那拦截器就能帮我们统一处理这些问题. 一.实现方式 1.1 自定义拦截器 自定义拦截器,即拦截器的实现类,一般有两种自定义方式: 定义一个类,实现org.springframework.web.servlet.HandlerInterceptor接口. 定义一个类,继承已实现了HandlerInterceptor接口的类,例如org.springframework.web.servlet.handler.Handle

  • Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程   逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码.   Mybaits 需要程序员自己编写 SQL 语句,但是 Mybatis 官方提供逆向工程可以针对单表自动生成 Mybaits 执行所需要的代码,包括 POJO.Mapper.java.Mapper.xml -. 一.通过 Eclipse 插件完成 Mybatis 逆向工程 1. 在线安装 Eclipse 插件  

随机推荐