使用speedment以Java 8 Stream访问数据库

speedment是一个开源持久层框架,类似Hibernate等持久层框架,能够实现以纯Java 8函数式流方式访问数据库,而Hibernate等ORM是以对象方式访问数据库。

Speedment支持MySQL, PostgreSQL 和 MariaDB等

假设MySQL有以下user表:


CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) NOT NULL,
`firstName` varchar(45) DEFAULT NULL,
`lastName` varchar(45) DEFAULT NULL,
`email` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email_UNIQUE` (`email`),
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB;

查询

查询邮件地址带有".com"的所有用户:


users.stream()
.filter(EMAIL.endsWith(".com"))
.forEach(System.out::println);

查询第一个名字是 “Adam” 或 “Cecilia” 的用户,并以用户名排序,取出排名前10个,获得邮件地址并打印出来:


users.stream()
.filter(FIRST_NAME.in("Adam", "Cecilia"))
.sorted(USERNAME.comparator())
.limit(10)
.map(User::getEmail)
.forEach(System.out::println);

新增
创建一个用户并持久化到数据库:


users.newEmptyEntity()
.setUsername("thorshammer")
.setEmail(
"mastergamer@castle.com")
.setPassword(
"uE8%3KwB0!")
.persist();

更新
查询到id = 10的用户并更新密码


users.stream()
.filter(ID.equal(10))
.map(u -> u.setPassword("pA6nLaX1Z"))
.forEach(User::update);

删除
删除 id = 100的用户


users.stream()
.filter(ID.equal(100))
.forEach(User::remove);

并行查询
能并行实现一些非常费事的操作,比如查询 id在10_000和20_000之间的用户:


users.stream()
.parallel()
.filter(ID.between(10_000, 20_000))
.forEach(expensiveOperation());

设置
上面展示了数据库的CRUD,那么如何设置Speedment以开始CRUD操作呢?非常简单:


final Speedment speedment = new JavapotApplication()
.withPassword("javapot") // 数据库密码
.build();

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

项目地址:
GitHub - speedment/speedment: Wrap your database i

看上去像那个JOOQ