MyBatis XPathParser解析器使用范例详解


Posted in Java/Android onJuly 15, 2022

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内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
一文搞懂Java中的注解和反射
Jun 21 Java/Android
java中如何截取字符串最后一位
Jul 07 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 #Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 #Java/Android
tree shaking对打包体积优化及作用
Jul 07 #Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 #Java/Android
一文了解Java动态代理的原理及实现
Jul 07 #Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
You might like
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
用函数读出数据表内容放入二维数组
2006/10/09 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
Numpy数组的广播机制的实现
2020/11/03 Python
如何用Django处理gzip数据流
2021/01/29 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
二年级体育教学反思
2014/01/15 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
高二学生评语大全
2014/04/25 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python