环境
JOOQ: “3.9.6”
java:1.8
springboot:1.5.10.RELEASE
前言
最近进小黑屋赶项目;
公司封装的分页方法,字段接收上,不能满足我,所以我就自己写了一个,
顺便了解了解JOOQ
的写法。
具体需求是个很简单的查询,传入页码、排序字段后,指定一个DTO类型来接收返回的字段。
代码
方法签名:
DAO层面的方法:
public Pagination<T> findItemDTOPage(Pageable pageable, List<Condition> conditions)
其中Pageable
是springboot包下的org.springframework.data.domain
;用于Controller
接收分页参数的。
第二个参数List<Condition> conditions
中Condition
是JOOQ
包下的:org.jooq
。
简单查询
比如现在查询第一页的数据,每页显示10条。
前端传的参数就是:page=0,size=10
。
默认排序是created
倒序;
如图,方法第二个参数使用了@PageableDefault
注解来指定默认排序。pageable
来接收page、size和sort字段
;
那么DAO
层的方法如下:
public Pagination<PurchaseRequestItemDTO> findItemDTOPage(Pageable pageable, List<Condition> prItemCondition) {
// 组装排序字段
List<SortField<?>> sortFields = Lists.newArrayList();
// pageable来自springboot包
Sort sort = pageable.getSort();
// 从这里可以看出,支持多字段排序
// 但是多字段排序方向是一个方向 要么升序,要么降序
sort.forEach(order -> {
String property = order.getProperty();
Field<?> field = PURCHASE_REQUEST_ITEM.field(property);
if (field != null) {
// Sort.Direction.ASC是JOOQ的
// order.getDirection()是springboot的
SortOrder sortOrder = order.getDirection() == Sort.Direction.ASC ? SortOrder.ASC : SortOrder.DESC;
SortField<?> sortField = field.sort(sortOrder);
sortFields.add(sortField);
}
});
List<PurchaseRequestItemDTO> purchaseRequestItemDTOS =
dsl.select(PURCHASE_REQUEST.fields())
.select(PURCHASE_REQUEST_ITEM.fields())
.select(PURCHASE_REQUEST.field(PURCHASE_REQUEST.ID).as("purchaseRequestId"),
PURCHASE_REQUEST_ITEM.field(PURCHASE_REQUEST.AUDITOR).as("approver"),
PURCHASE_REQUEST.field(PURCHASE_REQUEST.CREATED).as("purchaseRequestCreated"))
.from(PURCHASE_REQUEST_ITEM.innerJoin(PURCHASE_REQUEST)
.on(PURCHASE_REQUEST.ID.eq(PURCHASE_REQUEST_ITEM.PURCHASE_REQUEST_ID)))
.where(prItemCondition)
.orderBy(sortFields)
.limit(pageable.getOffset(), pageable.getPageSize())
.fetchInto(PurchaseRequestItemDTO.class);
// Pagination公司封装的返回前端的分页类
Pagination<PurchaseRequestItemDTO> pagination = new Pagination<>();
pagination.setContent(purchaseRequestItemDTOS);
pagination.setPage(pageable.getPageNumber());
pagination.setSize(pageable.getPageSize());
return pagination;
}
分析:
1、PURCHASE_REQUEST.fields()
获取该表的所有字段。
2、PURCHASE_REQUEST.field(PURCHASE_REQUEST.ID).as("purchaseRequestId")
字段重命名;这样写太啰嗦了,也可以:
PURCHASE_REQUEST.ID.as("purchaseRequestId")
3、where()
方法有很多重载方法,支持集合、数组,字段,SQL等查询,具体可以看源码;
4、orderBy()
方法,也有多种重载方法。
5、limit()
第一个参数偏移量,第二个参数是每次偏移的数量。
6、fetchInto()
这个方法参数是指定模型类,来接收查询出来的字段数据。
如果是关联查询,比如上面的代码,我使用的是自定义DTO
类来接收的。
公司里使用某个表类(JOOQ自动生成的表类)来接收,这样会导致另一张表的字段没办法获取。所以自定义好些。
总结
熟悉JOOQ
后,感觉比mybatis
方便。