Speedment -- 利用lambda编写SQL

时间:2021-03-05 12:01:27

众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发。Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis,它可以极大减少SQL语句的编写。

从图形界面开始使用Speedment

Speedment使用Groovy配置来找到数据库并生成对应的一些Java代码,groovy配置文件一般不需要自己来编写,而是通过Speedment的maven插件来产生。

这里我使用的Speedment版本是2.2.2

要使用Speedment,首先要在maven的pom.xml文件中加入以下的内容:

<properties>
...
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<speedment.version>2.2.2</speedment.version>
...
</properties>
<build>
<plugins>
...
<plugin>
<groupId>com.speedment</groupId>
<artifactId>speedment-maven-plugin</artifactId>
<version>${speedment.version}</version>
</plugin>
...
</plugins>
</build>
<dependencies>
...
<dependency>
<groupId>com.speedment</groupId>
<artifactId>speedment</artifactId>
<version>${speedment.version}</version>
</dependency>
...
</dependencies>

配置添加到pom.xml之后,在命令行输入maven命令 mvn speedment:gui来启动Speedment GUI界面。

根据图形界面上的提示,输入数据库的配置。

目前Speedment仅支持三种类型的数据库:

  • MySQL
  • MariaDB
  • PostgreSQL

其中PostgreSQL是2.2.3(也就是最新的版本)中新加入的,但是由于2.2.3的gui命令似乎有些问题,似乎PostgreSQL暂时还不可以使用Speedment来操作。

简单操作的API

在代码自动生成完毕之后,开发者几乎不需要再去做什么配置就可以开始操作数据库了。

初始化配置

Speedment有一个核心类Speedment来派生类Manager操作每一张表。

Speedment speedment = new TestApplication().withPassword("myPwd").build();

Manager<User> userManager = speedment.managerOf(User.class);

由于Speedment GUI在产生配置的使用并不会保存数据库的密码,所以在初始化类的时候,我们依旧需要输入对应账户的数据库密码,才可以继续操作数据库。

持久化数据

每一个Speedment生成的实体类对象都拥有一个方法persist(),每当调用这个方法的时候,程序中的类就会持久化到数据库中去。

User user = userManager.newInstance()
.setAge(20)
.setName("hello")
.persist(); // persist()方法同样适用于更新数据
user.setAge(21).persist();

当持久化异常的时候,Speedment会抛出一个SpeedmentException的异常信息。

数据删除

利用Manager类还可以删除对应的数据

userManager.remove(user);

数据查询

查询是SQL操作中相当重要的一环,这也是lambda表达式给SQL查询带来极大便利的一个地方,一般的orm框架的查询都是基于非常繁琐的配置才可以在程序中相对方便的使用查询。

userManager.stream()
.filter(user -> user.getAge().get() > 8)
.collect(toList());

Java8的stream类中有一个parallel()方法,启用之后Java会调用fork/join框架进行多核并行计算,在一些复杂查询的时候,可以提高处理结果的效率。(但是并行计算会需要更多的启动时间,在简单查询中并不是一个好的选择。)

userManager.stream()
.parallel()
.filter(user -> user.getAge().get() > 8)
.collect(toList());

序列化成JSON

JSON正在成为越来越重要是一种数据格式,在最新的MySQL5.7中MySQL也是开始支持json成为一种基本的数据格式了,Speedment中每一个数据记录都可以利用toJson()函数被转换成json格式

userManager.stream()
.map(Hare::toJson)
.forEach(System.out::println);

体验指南

Speedment需要Java 8的支持,最新的版本应该是2.2.3,但最新的版本中, maven的gui命令似乎出现了一些bug,导致配置文件没有办法生成,建议各位可以先使用2.2.2体验一下Speedment。

Java8出世已经有两年的时间,像Speedment这样围绕lambda语法的框架开始逐渐增多,越来越多的开发者也可以开始在Java的平台上体会到函数式编程的便利了。