这些年我接触/学习过得ORM框架或库也有一箩筐了。
- dbutils
- mybatis
- sql2o
- beetlsql
- hibernate
- cayenne
- spring-data-jpa
- querydsl
我觉得springboot应用中最得心应手的利器,还是 spring-data-jpa + queryds。但是它好像在国内不怎么流行,看国内的开源项目,工作遇到的项目基本都是mybatis/mybatis-plus。写不完的xml和mapper,用不完的代码生成。
这种单表CRUD的ORM框架,不能灵活的JOIN,投影查询。新增一个JOIN表,就要新写一个mapper方法和xml,新增一个查询列,也要新写一个mapper方法和xml(当然,我看到很多人很多人永远都是SELECT *
干到底,一个 findOne 方法,哪里都可以用)。还要配置各种结果集映射。实在是太累了。
前阵子看到JEECMS
居然用的就是QueryDsl,我就想着写一个教程。也不能算是教程,只能算是一堆案例,QueyDsl的各种使用案例。如果你对QueryDsl一无所知,也可以直接看看。它并不难,你只要会写SQL语句,那就会用了90%
QueyDsl
快速的解释一下这玩意儿咋用,QueryDsl需要配置JPA使用,它根据你定义的JPA Entity
实体类,逆向的生成查询类。通过操作查询类完成SQL的操作。
逆向生成的过程,完全自动,只需要配置好maven插件,定义好实体类就行。
怎么去操作这些查询类?你会写SQL就会操作。
它能完成项目中的大部分SQL查询,太复杂了也没辙。但是可以用spring-data-jpa的原生查询。
快速看一眼
实体类 User 定义
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.With;
@Data
@Builder
@AllAr