SpringBoot整合Spring-Data-Jpa+QueryDsl以及使⽤案例
这些年我接触/学习过得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 Serializable;
import BigDecimal;
import LocalDateTime;
import Column;
import Entity;
import EnumType;
import Enumerated;
import GeneratedValue;
import GenerationType;
import Id;
import Index;
import Table;
import UniqueConstraint;
import AllArgsConstructor;
import Builder;
import Data;
import NoArgsConstructor;
import With;
@Data
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@With
@Entity
@Table(name ="user", uniqueConstraints ={
@UniqueConstraint(columnNames ="name", name ="name")
}, indexes ={
@Index(columnList ="department_id", name ="department_id")
})
@org.hibernate.annotations.Table(appliesTo ="user", comment ="⽤户")
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID =1691873956126863400L;
@Id
@Column(columnDefinition ="INT UNSIGNED COMMENT 'ID'")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition ="VARCHAR(50) COMMENT '名字'", nullable =false)
private String name;
@Column(columnDefinition ="VARCHAR(10) COMMENT '性别'", nullable =false)
@Enumerated(EnumType.STRING)
private Gender gender;
@Column(columnDefinition ="DECIMAL(10,2)COMMENT '账户余额'")
private BigDecimal balance;
@Column(name ="department_id", columnDefinition ="INT UNSIGNED COMMENT '部门ID'", nullable =false)
private Integer departmentId;
@Column(columnDefinition ="TINYINT UNSIGNED COMMENT '是否启⽤。0:禁⽤,1:启⽤'", nullable =false) private Boolean enabled;
@Column(columnDefinition ="TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时
间'", nullable =false) private LocalDateTime createAt;
@Column(columnDefinition ="TIMESTAMP DEFAULT NULL COMMENT '修改时间'")
private LocalDateTime updateAt;
public static enum Gender {
MALE,// 男
FEMALE // ⼥
}
}
QueryDsl⾃动⽣成的查询类
import static PathMetadataFactory.*;
import*;
import PathMetadata;
import Generated;
import Path;
/**
* QUser is a Querydsl query type for User
*/
@Generated("degen.DefaultEntitySerializer")
public class QUser extends EntityPathBase<User>{
private static final long serialVersionUID =373632107L;
public static final QUser user =new QUser("user");
public final NumberPath<BigDecimal> balance =createNumber("balance",BigDecimal.class);
public final DateTimePath<LocalDateTime> createAt =createDateTime("createAt",LocalDateTime.class);
public final NumberPath<Integer> departmentId =createNumber("departmentId", Integer.class);
public final BooleanPath enabled =createBoolean("enabled");
public final EnumPath<User.Gender> gender =createEnum("gender", User.Gender.class);
public final NumberPath<Integer> id =createNumber("id", Integer.class);
public final StringPath name =createString("name");
public final DateTimePath<LocalDateTime> updateAt =createDateTime("updateAt",LocalDateTime.class);
public QUser(String variable){
spring到底是干啥的super(User.class,forVariable(variable));
}
public QUser(Path<?extends User> path){
Type(), Metadata());
}
public QUser(PathMetadata metadata){
super(User.class, metadata);
}
}
查询Demo
JPAQueryFactory query =new ityManager);
QUser qUser = QUser.user;// ⽣成的查询对象,可以理解为数据表
User user = query.select(qUser).from(qUser).where(qUser.id.eq(1)).fetchOne();// 查询唯⼀记录,如果结果不⽌⼀个则异常
有感觉了没?⽤Java代码的⽅式写SQL。⽤代码的⽅式进⾏JOIN检索,投影查询,结果集封装。实在是太灵活。通过合理的抽象设计,直接在Controller就能把SQL执⾏了。
由于是根据实体类⽣成的查询对象,那么在修改了实体类的字段名称后,查询对象会重新⽣成。在代码中涉及到修改/删除字段的相关操作都会在编译时异常。⽽不是xml⼀样,得去挨个,甚⾄没法。不知道哪些⼈在哪些xml中⽤了这个被修改的字段。
官⽅地址
官⽹
Github
QueryDsl Example
案例有10来个,不⽅便在⼀篇帖⼦⾥⾯展开,所以新建了⼀个⼯程在Github。这个⼯程整合了spring-data-jpa 和 querydsl以及⼀些常⽤的案例。
软件版本
SpringBoot 2.6.1
Java 17
MYSQL 8.x
需要⼿动创建数据库(看yaml配置),系统启动会后⾃动创建数据表(包括索引)。
Example代码
都在 src/main/resources ⽬录下,可以每⼀个都执⾏⼀下看看,希望你会喜欢这玩意⼉。
DataInit 初始化演⽰数据(最先执⾏)
Example1 单表的查询/编辑/删除
Example2 join查询
Example3 分页/排序
Example4 条件列⼦查询/查询列⼦查询/exists⼦查询/count⼦查询
Example5 聚合查询
Example6 条件分组
Example7 加锁
Exapmle8 结果集封装
Exapmle9 结果列的⼀些操作。case/转换/null判断…
Exapmle10 spring-data-jpa 的⽀持
最后,⾮常欢迎⼤家指出代码中的问题,提出相关建议。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论