认识反摩尔定律的Java 8神器Speedment,实现数据库代码减半

原文链接:https://dzone.com/articles/java-8-query-databases-using-streams
小象科技原创作品,欢迎大家疯狂转发;
机构、自媒体平台转载务必至后台留言,申请版权。
 
认识反摩尔定律的Java 8神器Speedment,实现数据库代码减半
  
回想九十年代末期我刚开始写Java数据库应用的时候什么事都得自己做。代码很多,而且异常处理对象转换都得自己写,所以很快代码就变得难以维护了。 就算是今天把Java和数据库这两个不同世界的东西联系起来还是相当的麻烦。
 
你得自己写映射层或者使用Hibernate这样的ORM工具,使用ORM当然会方便点但配置的时候比较容易出错。很多时候ORM也会让程序变慢。 最近我参与了一个新的开源项目Speedment,希望它能减轻广大Java 8数据库应用开发者们的工作量。
 

 
1Speedment是什么 
Speedment是一个针对Java 8所设计开源库,它从一开始就是使用Java 8开发的。Speedment使用标准的流式操作来进行数据库查询所以开发人员不需要学习新的查询API。用了Speedment你就可以从此忘了JDBC和ResultSet了。
 
Speedment可以自动分析数据库并生成代码和文档,所以开发人员不用为数据库实体写任何一行代码。开发人员只需要创建一个数据库并连接到Speedment,剩下的工作都可以交给Speedment了。我们给Speedment设计的吉祥物是个卡通小野兔,所以我在例子里面就用hare这个英文单词作为表的名字。
 
mysql> explain hare;
+-------+-------------+------+-----+---------+----------------+
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    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
Speedment会分析这个表并生成下面的代码:
public interface Hare extends Entity {
   public final static ReferenceComparableField ID = new ReferenceComparableFieldImpl<>("id", Hare::getId, Hare::setId);
   public final static ReferenceComparableStringField NAME = new ReferenceComparableStringFieldImpl<>("name", Hare::getName, Hare::setName);
   public final static ReferenceComparableStringField COLOR = new ReferenceComparableStringFieldImpl<>("color", Hare::getColor, Hare::setColor);
   public final static ReferenceComparableField AGE = new ReferenceComparableFieldImpl<>("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进行比较所以可以减少对数据库的压力。如果你所写的过滤条件更多那么智能流的内容也就更少。下面是另一个例子:
 
long noOldHares = 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代码,正好每两年长度减少一半。这就是进步啊!
 

0 个评论

要回复文章请先登录注册