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

16-04-26 banq

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;
<p class="indent">


查询

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

users.stream()
            .filter(EMAIL.endsWith(".com"))
            .forEach(System.out::println);
<p class="indent">


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

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


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

users.newEmptyEntity()
            .setUsername("thorshammer")
            .setEmail("mastergamer@castle.com")
            .setPassword("uE8%3KwB0!")
            .persist();
<p class="indent">


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

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


删除
删除 id = 100的用户

  users.stream()
            .filter(ID.equal(100))
            .forEach(User::remove);
<p class="indent">


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

  users.stream()
            .parallel()
            .filter(ID.between(10_000, 20_000))
            .forEach(expensiveOperation());
<p class="indent">


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

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

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


项目地址:

GitHub - speedment/speedment: Wrap your database i

lostalien
2016-05-03 12:08

看上去像那个JOOQ