SpringBoot整合Spring-Data-Jpa + QueryDsl以及使用案例

本文介绍了如何在SpringBoot应用中结合Spring-Data-Jpa和QueryDsl进行数据操作,强调了QueryDsl的便捷性和灵活性,提供了一种避免繁琐XML映射的方法。通过实体类定义和QueryDsl的自动查询类生成,实现了Java代码方式的SQL操作,包括JOIN、投影查询等。并给出了官方地址和一个包含多个查询案例的GitHub项目链接。

这些年我接触/学习过得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
@AllArgsConstructor
Spring Boot项目中集成JPAQueryDSL可以显著提升数据访问层的开发效率,同时提供类型安全的查询能力。以下是详细的配置步骤: ### 1. 添加依赖 首先,在`pom.xml`文件中添加Spring Data JPAQueryDSL的相关依赖。确保使用Spring Boot版本兼容的QueryDSL版本。 ```xml <dependencies> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- QueryDSL JPA --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> </dependency> <!-- QueryDSL APT Maven Plugin 用于生成Q类 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> </dependencies> ``` 此外,还需要配置Maven插件来生成QueryDSL所需的Q类(用于构建类型安全的查询): ```xml <build> <plugins> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> ``` ### 2. 配置数据源和JPA属性 在`application.properties`或`application.yml`中配置数据库连接信息以及JPA相关属性: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database spring.datasource.username=root spring.datasource.password=your_password spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect ``` ### 3. 创建实体类 定义一个JPA实体类,并使用标准的JPA注解进行映射: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // Getters and Setters } ``` ### 4. 生成QueryDSL Q类 运行Maven编译命令以触发APT插件生成Q类: ```bash mvn clean compile ``` 成功后,会在`target/generated-sources/java`目录下生成类似`QUser`的类。 ### 5. 创建Repository接口 创建一个继承自`JpaRepository`和`QueryDslPredicateExecutor`的接口,以便支持QueryDSL查询: ```java import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.querydsl.QueryDslPredicateExecutor; public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> { } ``` ### 6. 使用QueryDSL进行查询 在服务层或控制器中注入`UserRepository`并使用QueryDSL构建查询: ```java import com.querydsl.core.types.Predicate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findUsersByName(String name) { QUser user = QUser.user; Predicate predicate = user.name.containsIgnoreCase(name); return (List<User>) userRepository.findAll(predicate); } } ``` ### 7. 启动应用并测试 启动Spring Boot应用,并通过REST API或其他方式调用上述服务方法,验证QueryDSL查询是否正常工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值