一、简介
Query Bean 是可选的,但它们提供了一种使用编写查询的方法,它们还易于使用和学习属性和表达式。 Query Bean 是使用 Java annotation processing (APT) 或 Kotlin annotation processing (KAPT)生成的。
对于每个实体,将生成一个具有相同名称,但以前缀Q开头的对象,比如对于名为 Order 的实体 Bean,会生成一个名为 QOrder 的查询 Bean。
当实体 Bean 模型更改时, Query Bean 也要重新生成,如果我们的查询对模型不再有效,则会收到编译时错误。本次我们主要使用maven插件生成。
使用Ebean一个是工作中用到,另外一个是确实是非常的方便,当然你们使用jpa或者mybatis都没有关系,反正这个就是创建一个实体的工程。只不过如果你是跟着我去做这个SpringCloud,我建议你还是使用Ebean,毕竟它还是一个非常牛逼的技术。
二、准备工作
2.1、Ebean插件安装
我这里的插件版本是 Ebean10.x Enhancement ,你们可以根据各自的环境需要安装。
三、maven依赖
3.1、pom.xml
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--父工程-->
<parent>
<groupId>cn.alian.microservice</groupId>
<artifactId>parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>cn.alian.domain</groupId>
<artifactId>domain-order</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>order</name>
<description>订单domain</description>
<dependencies>
<dependency>
<groupId>io.github.hexagonframework.boot</groupId>
<artifactId>spring-boot-starter-data-ebean</artifactId>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>spring-boot-repackage</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<!--ebean打包的插件-->
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.26</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>org.avaje.tile:java-compile:1.1</tile>
<tile>io.ebean.tile:enhancement:12.2.6</tile>
</tiles>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>nexus-repos</id>
<name>Team Nexus Repository</name>
<url>http://192.168.0.210:8081/nexus/content/groups/public</url>
</repository>
<repository>
<id>nexus-repos-snapshots</id>
<name>Team Nexus Repository Snapshots</name>
<url>http://192.168.0.210:8081/nexus/content/groups/public-snapshots</url>
</repository>
<repository>
<id>aliyun-maven-repo</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-repos</id>
<name>Team Nexus Repository</name>
<url>http://192.168.0.210:8081/nexus/content/groups/public</url>
</pluginRepository>
<pluginRepository>
<id>nexus-repos-snapshots</id>
<name>Team Nexus Repository Snapshots</name>
<url>http://192.168.0.210:8081/nexus/content/groups/public-snapshots</url>
</pluginRepository>
</pluginRepositories>
</project>
这里具体的依赖的版本号,可以查看我之前的文章,并且不要盲目的使用高版本的Ebean,而想要打包时自动生成 Query Bean 的关键在于下面这个插件
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.26</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>org.avaje.tile:java-compile:1.1</tile>
<tile>io.ebean.tile:enhancement:12.2.6</tile>
</tiles>
</configuration>
</plugin>
四、domain
4.1、实体
Order.java
package cn.alian.domain.order.domain;
import io.ebean.annotation.DbEnumValue;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
@Setter
@Getter
@Entity
@Table(name = "tb_order")
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", insertable = false, nullable = false)
private Integer id;
/**
* 用户id
*/
@Column(name = "user_id", nullable = false)
private int userId;
/**
* 商品id
*/
@Column(name = "goods_id", nullable = false)
private int goodsId;
/**
* 单价
*/
@Column(name = "price", nullable = false)
private Integer price = 0;
/**
* 数量
*/
@Column(name = "num", nullable = false)
private Integer num = 1;
/**
* 订单标题
*/
@Column(name = "title", nullable = false)
private String title = "";
/**
* 订单状态
*/
@Column(name = "order_status", nullable = false)
private String orderStatus = "01";
/**
* 创建时间
*/
@Column(name = "create_time", nullable = false, insertable = false, updatable = false)
private LocalDateTime createTime;
/**
* 更新时间
*/
@Column(name = "update_time", nullable = false, insertable = false, updatable = false)
private LocalDateTime updateTime;
public enum StatusEnum {
SUCCESS("00", "成功"),
HANDING("01", "处理中"),
FAIL("02", "失败");
private final String code;
private final String desc;
StatusEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
@DbEnumValue
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static Order.StatusEnum get(String code) {
Order.StatusEnum[] values = Order.StatusEnum.values();
for (Order.StatusEnum e : values) {
if (e.code.equals(code)) {
return e;
}
}
return null;
}
}
}
4.2、持久层
OrderRepository.java
package cn.alian.domain.order.repository;
import cn.alian.domain.order.domain.Order;
import org.springframework.data.ebean.repository.EbeanRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends EbeanRepository<Order, Integer> {
}
啥也不用做了,打包就行了,以后我们的实体都按照上面的方式写,然后去打包,它会为我们生成很多的静态查询方法,后面我会对使用进行简单举例。
4.3、脚本
deploy.bat
cd %~dp0
cd..
call mvn clean source:jar deploy -Dmaven.test.skip=true
cd bin
pause
package.bat
cd %~dp0
cd..
call mvn clean package -Ppack -X -Dmaven.test.skip=true
cd bin
pause
4.4、打包效果
最终的结果:
4.5、使用举例
使用方法简单举例:
//查询订单id为123订单信息
int id=123;
Order order = new QOrder()._id().eq(id).findOne();
//查询用户id为456的所有订单
int userId=456;
List<Order> orderList = new QOrder()._userId().eq(userId).findList();
//查询用户id为456的已完成的订单(已完成状态为00)
int userId=456;
String orderStatus="00";
List<Order> orderList = new QOrder()._userId().eq(userId).and()._orderStatus().eq(orderStatus).findList();
4.6、官方文档
更多的关于使用参考官网