Java对象查询方法:Jxpath(转译)
在JAVA对象中,如何进行有效的查询呢,这一直是个很值得探讨的问题.大家知道,在XML中,要找元素如何找呢?没错,通过XPATH
是个不错的办法,同样道理,新近发现原来在JAVA中,也居然有象XPATH里的东西,这就是著名的apache commons库中包含的jxpath包中所提供的功能,这可以在http://jakarta.apache.org/commons/jxpath/中找到相关下载.下面来简单介绍一下(注:本文内容主要来自

http://today.java.net/pub/a/today/2006/08/03/java-object-querying-using-jxpath.html
,本人有所改动和润色)
     
什么是JXPATH
     首先,JXPATH是通过简单的表达式,可以在JAVA的类对象层次中进行查询.我们还是来看简单的例子来说明问题:
      比如,我们的例子中,有一些公司,每间公司有不同的部门,每个不同的雇员,而且当然,公司有它们的CEO.雇员还有比如姓名,电话等属性.

假设我们要查找在California的公司中,有哪些公司的部门中有超过10位员工的话,以前会这样写的
for (Iterator companies =  database.getCompanies().iterator();  companies.hasNext();)
 {
//获得所有公司
  Company company = (Company)companies.next();

//获得在California的公司
  if (company.getLocation().equals("CAA")) {

for (Iterator departments =company.getDepartments().iterator();departments.hasNext(); )
{

//获得公司的所有部门
      Department department =
                    (Department)departments.next();

if (department.getEmployees().size() > 10) {
        System.out.println(department);
      }
    }
  }
}

而如果用JXPATH的话,可以这样写
Iterator departments = context.iterate(
           "/companies[location='CA']" +
           "/departments[count(employees) > 10]");
while (departments.hasNext()) {
  System.out.println(departments.next());
}

可以看到,用了JXPATH的话,只需要简单指定好表达式,马上就可以了.下面来简单介绍下一些写法
比如:

要多的所有的公司:/companies
获得公司下的部门:/companies/departments
获得在某个地方的公司:/companies[location='CA'],这里,location为companies的属性

要获得位于CA的公司中含有开发部门的公司的话,可以这样:
/companies[location='CA']/departments[contains(name, 'Development')]

要获得某个部门雇员数大于10人的:/companies/departments[count(employees) > 10]

要获得SUN公司下第二个部门:/companies[name='Sun Microsystems']/departments[2]
要注意的是,JXPATH的序号是从1开始,不是从0开始

和XPATH类似,可以象这样
/companies[name='Sun Microsystems']/
           departments[last()]

接下来说下如何配合JAVA代码来实现查询
首先,对比如对于company,employee,department这三个类,都必须设置getter,setter方法,
  然后,比如要有
public List getCompanies();

后,则可以使用
/Companies来查询了

而每个公司下面要查询所有的部门的话,先设置
public List getDepartments();
方法,
然后再用/companies/departments可以查询了;

提供public String getName();方法,则在下面的场景中会被调用:

/companies/departments[name='Server Development']

又比如,假设已经设置了一个MAP,里面存放某人的电话,比如有工作电话,私人电话:

Map numbers = employee.getTelephoneNumbers();
String workNumber =
          (String)numbers.get("work number");

上面是取得某个雇员的工作电话,但必须这样写JXPATH
.../employees[1]/
          telephoneNumbers[@name='work number']
@name是用来指定MAP中的KEY的,而不能简单将上面的写成
.../employees[1]/
          telephoneNumbers/work number

最后,我们可以结合起来使用jxpath了,首先先声明根对象,也就是说,你要先构造出一个类层次出来,比如已经构造出一个类层次,叫
database类,则:
JXPathContext context = JXPathContext.
                            newContext(database);
其中database类里面已经有所有的公司的实例了,这里先取出其上下文context;然后,
Iterator departments = context.iterate("/companies[location='WA']" +
        "/departments[count(employees) > 10]");

则取出所有在WA的那些部门人数>10的所有公司的集合了

最后输出:
while (departments.hasNext()) {
  Department dept = (Department)i.next();
}

看,多简单呀.

最后,强烈大家去下载本文的例子去看看,在ECLIPSE里跑一下就可以了,写的很清晰
代码:http://today.java.net/today/2006/08/03/source_code.tar.gz

posted on 2006-08-26 16:14 jackyrong的世界 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jackyrong/archive/2006/08/26/487084.html

Java对象查询方法:Jxpath(转译)相关推荐

  1. java x00_有没有通过python反序列化java对象的方法

    我将java对象存储在hbase中(例如,假设我有一个对象'User',有3个参数,比如firstname.middlename和lastname).我在java中使用以下代码进行序列化Object ...

  2. BOS12——多对多添加方法,多对多页面需要字段问题(不多的话直接提供get方法),修改Realm中授权方法(查询数据库),缓存Java对象的方法,加载左侧菜单(ztree提供pId)...

    1.多对多添加方法 @Override public void add(Role model, String functionIds) {// 1.先将角色保存到数据库roleDao.save(mod ...

  3. 比较两种php调用Java对象的方法

    Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用.在php中调用Java语言有两种方法,一种是使用php中 的Java扩展模块,另一种是使用minij2ee应用服务器提供 ...

  4. Java对象克隆方法(浅克隆、深克隆)

    要让一个对象进行克隆,其实就是两个步骤: 1. 让该类实现java.lang.Cloneable接口: 2. 重写(override)Object类的clone()方法. 上面的克隆方法其实是浅克隆, ...

  5. 浅谈ThingJs之对象查询方法

    在开发中,引入了场景,添加了对象,那我们如何尽快的找到对象呢? 方法如下: 1.在父类/子类树上,通过parent.children属性找到要控制的对象 2.在分类对象属性树上,通过类身上分类属性找到 ...

  6. java对象扩展方法_高可扩展的面向对象代码架构是如何设计的

    导语 Java后端程序员的日常工作,大多数可能都是写基于数据库CRUD的Dao层.Manager层.Service层.Controller层,需求来了,就对着这几个层一顿怼代码.调试跑通了,就完事了. ...

  7. java模糊查询代码_Java模糊查询方法详解

    这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下 当我们需要开发一个方法用来查询数据库的时候,往往会遇到这样一个问题:就是不知 ...

  8. 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

    文章目录 I . JNI 线程创建 II . 线程执行函数 III . 线程方法获取 Java 对象 IV . 线程方法获取 JNIEnv V . JNI 线程 完整代码示例 I . JNI 线程创建 ...

  9. 转载--编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议31~35)...

    阅读目录 建议31:在接口中不要存在实现代码 建议32:静态变量一定要先声明后赋值 建议33:不要覆写静态方法 建议34:构造函数尽量简化 建议35:避免在构造函数中初始化其它类 书读的多而不思考,你 ...

最新文章

  1. 如何搭建以太坊私有链
  2. python如何控制运行时间_python 限制函数执行时间,自己实现
  3. 女鬼之阴魂不散(C#版)
  4. TIOBE 2014年7月编程语言排行榜:仅发布1月,Swift进Top 20!
  5. Laravel源码解析之Request
  6. Windows Server 2003 系统安装
  7. IOS NSNotification 通知
  8. label y 训练集测试集x_Pytorch将数据集划分为训练集、验证集和测试集
  9. OpenCV(VS2019)——无法打开“opencv2/opencv.hpp”文件
  10. 关于linux系统无法启动,提示Give root password for maintenace的解决办法
  11. flash发布html快捷键,flash快捷键大全
  12. 程序员如何实现财富自由?
  13. 编辑器 的保存怎么绑定事件_135编辑器有哪些可以快速提升新媒体小编工作效率的功能?...
  14. 十一假期,分享几个好玩儿的GitHub项目
  15. java ee jpi是什么,“JPI”是“Java Plug In”的缩写,意思是“Java插件”
  16. Python实现b''开头二进制字符串转换为str的utf-8
  17. 51假期读书笔记(下)——流畅的python
  18. SS, SP, BP 三个寄存器
  19. java的八种基本蕾西_(1/7)[代码整洁之道]你真的会用枚举吗?非也!
  20. java 取视频第一帧,java获取视频的第一帧

热门文章

  1. java程序包不存在_第一章 Java语言简介
  2. idea mybatis generator插件_在idea中使用mybatis generator逆向工程生成代码
  3. linux mint 17.3 内核,LinuxMint 17.3 Cinnamon抢鲜评测
  4. php 字体问题,php – Scraping上的字体或Unicode问题[复制]
  5. 为了探究不同光照处理_渭南市实验初中“诱思探究学导”课堂教学改革展示活动圆满成功...
  6. php随机生成器加密,php生成随机密码的几种方法
  7. opengl绘制长方体线框_OpenGL 绘制长方体 计算机图形学
  8. C++知识点14——类与static
  9. ANSYS静力学分析时如何添加重力
  10. opencv图像操作:读取,裁剪,保存,缩放,遍历和读取文件夹图片