认识反摩尔定律的
Java 8神器Speedment
实现数据库代码减半
回想九十年代末期我刚开始写Java数据库应用的时候什么事都得自己做。代码很多,而且异常处理对象转换都得自己写,所以很快代码就变得难以维护了。 就算是今天把Java和数据库这两个不同世界的东西联系起来还是相当的麻烦。
你得自己写映射层或者使用Hibernate这样的ORM工具,使用ORM当然会方便点但配置的时候比较容易出错。很多时候ORM也会让程序变慢。 最近我参与了一个新的开源项目Speedment,希望它能减轻广大Java 8数据库应用开发者们的工作量。
1
Speedment是什么
Speedment是一个针对Java 8所设计开源库,它从一开始就是使用Java 8开发的。Speedment使用标准的流式操作来进行数据库查询所以开发人员不需要学习新的查询API。用了Speedment你就可以从此忘了JDBC和ResultSet了。
Speedment可以自动分析数据库并生成代码和文档,所以开发人员不用为数据库实体写任何一行代码。开发人员只需要创建一个数据库并连接到Speedment,剩下的工作都可以交给Speedment了。我们给Speedment设计的吉祥物是个卡通小野兔,所以我在例子里面就用hare这个英文单词作为表的名字。
mysql>explainhare;
+-------+-------------+------+-----+---------+----------------+
|Field| Type |Null|Key|Default| Extra |
+-------+-------------+------+-----+---------+----------------+
| id |int(11) |NO| PRI |NULL|auto_increment|
| name |varchar(45) |NO| |NULL| |
| color |varchar(45) |NO| |NULL| |
| age |int(11) |NO| |NULL| |
+-------+-------------+------+-----+---------+----------------+
4rowsinset(0.01sec)
Speedment会分析这个表并生成下面的代码:
publicinterfaceHareextendsEntity {
publicfinalstaticReferenceComparableField ID =newReferenceComparableFieldImpl<>("id", Hare::getId, Hare::setId);
publicfinalstaticReferenceComparableStringField NAME =newReferenceComparableStringFieldImpl<>("name", Hare::getName, Hare::setName);
publicfinalstaticReferenceComparableStringField COLOR =newReferenceComparableStringFieldImpl<>("color", Hare::getColor, Hare::setColor);
publicfinalstaticReferenceComparableField AGE =newReferenceComparableFieldImpl<>("age", Hare::getAge, Hare::setAge);
Integer getId();
String getName();
String getColor();
Integer getAge();
Hare setId(Integer id);
Hare setName(String name);
Hare setColor(String color);
Hare setAge(Integer age);
/** Graph-like traversal methods eliminating JOINs */
Stream findCarrotsByOwner();
Stream findCarrotsByRival();
Stream findCarrots();
}
2
查询
下面的代码是对Hare表进行查询的一个例子:
List oldHares = hares.stream()
.filter(AGE.greaterThan(8))
.collect(toList());
3
智能流
上面的代码看起来似乎会需要用到Hare表里所有的行,然而事实并非如此。这也就是它“智能”的地方。运行到collect()的时候,它会知道需要把Hare表里的AGE与8进行比较所以可以减少对数据库的压力。如果你所写的过滤条件更多那么智能流的内容也就更少。下面是另一个例子:
longnoOldHares = hares.stream()
.filter(AGE.greaterThan(8))
.mapToInt(Hare::getAge)
.sorted()
.count();
因为最后的操作是count,所以Speedment会自动忽略sort和mapToInt因为它们对于count操作的结果没有任何影响。这意味着开发人员可以只专注于程序逻辑,不必操心语句是如何转换为SQL的。
4
下载
欢迎到Speedment官网www.speedment.org看看,上面有API文档和教程。Speedment托管在GitHub上面,大家可以在上面下载源代码或者提交反馈。
5
小结
代码也是遵守反摩尔定律的:我前些年写的100行数据库代码现在只需要一行Java 8代码,正好每两年长度减少一半。这就是进步啊!
▼参与本文讨论请猛戳“阅读原文”