一个大集合里面过滤获取其中的部分数据是一个很常见的需求,比如在财务系统中,用户会维护汇率这样的数据:
public class ExchangeRate {
private String fromCurrency;
private String toCurrency;
private Date fromDate;
private Date thruDate;
private double rate;
}
在系统计算的时候,会用到类似这样的方法,来获取某个时间点2个货币单位之间的汇率:
public double getRate(String fromCurrency, String toCurrency, Date when)
最常见的实现方法就是用查询语句(SQL/HSQL/EJBQL)来获取,考虑到这种类型数据的2个特性:
1. 数据量比较少
2. 经常被查询到
我们往往会给它们加上Cache来提高性能,在Hibernate里面我们可以配置查询缓存来实现,考虑到Hibernate查询缓存是用查询参数做为Cache Key的特性,为了节省缓存空间,更常见的做法是缓存所有ExchangeRate,然后从这个集合里面过滤,比如说用apache的Collection Utils来实现:
return CollectionUtils.find(getAllExchangeRates(), new Predicate() {
public boolean evaluate(Object o) {
ExchangeRate r = (ExchangeRate) o;
return r.getFromCurrency().equals(fromCurrency) && r.getToCurrency().equals(toCurrency) && ...
}
}).getRate();
我们需要一个Java匿名内部类来做,这样的代码看起来不是很简洁,而且和大家熟悉的SQL是不同的风格,如果可以用一种和它们类似的方式来实现,会好很多,JoSQL ( http://josql.sourceforge.net/ ) 就是这样的工具:
JoSQL (SQL for Java Objects) provides the ability for a developer to apply a SQL statement to a collection of Java Objects. JoSQL provides the ability to search, order and group ANY Java objects and should be applied when you want to perform SQL-like queries on a collection of Java Objects.
用JoSQL来实现上面的例子:
Query q = new Query();
q.parse("select * from ExchangeRate where fromCurrency = :fromCurrency and toCurrency = :toCurrency and fromDate <= :when and thruDate >= :when");
q.setVariable("fromCurrency", fromCurrency);
q.setVariable("toCurrency", toCurrency);
q.setVariable("when", date);
return q.execute(getAllExchangeRates()).getResults().get(0).getRate();
我们可以看到和SQL的查询方式非常类似,这里只是一个JoSQl最简单的功能,在它的文档里面:http://josql.sourceforge.net/manual/examples.html还可以看到Order, Grouping, Execute On等特性,对于实现常见的用户需求来说是非常有用的。
回到上面的例子,默认的JoSQL代码对于实现这种fiter性质的功能来说还是稍显麻烦,我们可以包装一下:
JoSQLUtil.find(list, "fromCurrency = ? and toCurrency = ? and fromDate <= ? and thruDate >= ?", new Object[]{fromCurrency, toCurrency, date, date}).get(0).getRate();
JoSQLUtil里面可以处理掉一些默认的拼凑SQL,设置参数等代码,这样会变得更加简洁了。
分享到:
相关推荐
JoSQL的核心概念是将Java对象映射到数据库表,通过定义对象的属性与表的字段对应,从而实现对数据库的CRUD(创建、读取、更新、删除)操作。这种映射机制类似于ORM(对象关系映射),但JoSQL更注重简单性和轻量级,...
JoSQL 2.2 是一个专门针对Java对象的SQL查询工具,它允许开发者使用SQL语法直接操作Java集合,极大地简化了在Java应用中处理对象集合的复杂性。这个工具的核心理念是将数据库查询的便捷性引入到内存中的Java对象处理...
2. **对象映射**:JoSQL将Java对象与SQL表的概念进行了映射,每个Java类对应一个“表”,类的实例是“行”,类的属性是“列”。这样,你可以直接使用对象的属性名作为SQL查询中的字段名。 3. **查询执行**:JoSQL...
jar包,亲测可用
JoSQL (SQL for Java Objects) provides the ability for a developer to apply a SQL statement to a collection of Java Objects. JoSQL provides the ability to search, order and group ANY Java objects and ...
尽管JoSQL提供了一种更简单的SQL操作方式,但值得注意的是,对于大型复杂的应用程序,可能需要更强大的ORM框架,如Hibernate或MyBatis,它们提供了更多的功能,如自动化数据映射、事务管理等。然而,对于小型项目...
基于java的开发源码-对象的SQL接口 JoSQL.zip 基于java的开发源码-对象的SQL接口 JoSQL.zip 基于java的开发源码-对象的SQL接口 JoSQL.zip 基于java的开发源码-对象的SQL接口 JoSQL.zip 基于java的开发源码-对象的SQL...
在这个例子中,`MyObject`是你定义的Java类,JoSQL会自动映射SQL查询到对应的Java对象。这种方式使得数据库操作更加直观,特别是当你处理复杂查询时,JoSQL的表达能力往往比纯JDBC更强大。 在"gentlyWEB-src-utils-...
JoSQL是Java编程语言中的一款库,它提供了一种简单的方法来查询和操作Java对象集合,就像使用SQL查询数据库那样。这个压缩包“Java对象的SQL接口 JoSQL.7z”很可能包含了JoSQL库的源代码、文档以及相关的示例项目,...
JoSQL 是一个用于Java对象的SQL查询库,它允许开发者使用SQL语法来处理和操作Java对象集合。这个库特别适用于需要对数据集合进行复杂查询、排序和分组的情况,而这些通常在传统的数据库操作中使用。JoSQL 提供了一种...
JoSQL 1.5的源代码。JoSQL(SQL for Java Objects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。比如要查找所有的Html文件:...
4. **易于集成**:JoSQL库小巧轻便,可以方便地集成到任何Java项目中,无论是MVC框架还是简单的命令行应用程序。 5. **性能优化**:尽管JoSQL通过对象映射增加了额外的抽象层,但经过优化的设计使得其性能损失最小,...
JoSQL是一个轻量级的Java库,它提供了一种简单的方法来执行SQL查询直接对Java对象集合。这个库的核心理念是将SQL语句应用于Java对象,就像它们是数据库表一样,使得在处理复杂数据操作时具有高度的灵活性。在深入...
JAVA源码Java对象的SQL接口JoSQL
JoSQL 支持的基本 SQL 功能包括 SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDER BY 子句,这些子句可以与 Java 对象的属性相对应,使得你可以根据对象的属性进行查询。此外,它还支持 JOIN 操作,允许你在多个 ...
java资源Java对象的SQL接口 JoSQL提取方式是百度网盘分享地址
基于java的对象的SQL接口 JoSQL.zip
在使用过程中,你可以查阅项目的文档,了解如何创建查询、处理查询结果以及如何与其他Java库或框架集成。 总而言之,JoSQL是一个强大的工具,它为Java开发引入了SQL查询的便利性,使得处理Java对象集合变得更加直观...
jar包,亲测可用