• Spring Boot整合Spring Data Jpa + QueryDSL


    简介

    Spring Data JPA是一个Spring项目中常用的持久化框架,它简化了与数据库进行交互的过程。而QueryDSL是一个查询构建框架,可以让我们以面向对象的方式来编写数据库查询。

    在本文中,我们将讨论如何使用Spring Boot整合Spring Data JPA和QueryDSL,并提供一个使用案例来演示它们的用法。

    准备工作

    首先,我们需要准备一个Spring Boot项目。你可以手动创建一个新的Spring Boot项目,也可以使用Spring Initializr快速生成一个项目的框架。

    添加依赖

    在创建好项目之后,打开pom.xml文件并添加以下依赖:

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-data-jpaartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>com.querydslgroupId>
    12. <artifactId>querydsl-aptartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>com.querydslgroupId>
    16. <artifactId>querydsl-jpaartifactId>
    17. dependency>
    18. dependencies>

    上述依赖包括了Spring Boot Web、Spring Data JPA和QueryDSL的必需依赖。

    配置数据库

    接下来,我们需要配置数据库连接。打开application.properties文件(或application.yml)并添加以下属性:

    1. spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
    2. spring.datasource.username=root
    3. spring.datasource.password=your-password
    4. spring.jpa.show-sql=true
    5. spring.jpa.hibernate.ddl-auto=create-drop

    请根据自己的数据库信息修改上述属性,确保能够成功连接到数据库。

    创建实体类和存储库

    在本例中,我们将创建一个简单的实体类User,以及用于访问数据库的存储库UserRepository

    实体类

    首先,在项目的包结构中创建一个名为entity的包,并在该包中创建一个User类。代码如下:

    1. package com.example.entity;
    2. import javax.persistence.Entity;
    3. import javax.persistence.GeneratedValue;
    4. import javax.persistence.GenerationType;
    5. import javax.persistence.Id;
    6. @Entity
    7. public class User {
    8. @Id
    9. @GeneratedValue(strategy = GenerationType.IDENTITY)
    10. private Long id;
    11. private String username;
    12. private String email;
    13. // 省略构造函数、getter和setter方法
    14. }

    User类使用了JPA注解,用于指定实体的映射关系。@Entity表示该类是一个实体类,@Id@GeneratedValue用于指定主键的生成策略。

    存储库

    接下来,在项目的包结构中创建一个名为repository的包,并在该包中创建一个UserRepository接口。代码如下:

    1. package com.example.repository;
    2. import com.example.entity.User;
    3. import org.springframework.data.jpa.repository.JpaRepository;
    4. import org.springframework.stereotype.Repository;
    5. @Repository
    6. public interface UserRepository extends JpaRepository {
    7. }

    UserRepository接口继承自JpaRepository,这是Spring Data JPA提供的通用存储库接口。我们不需要编写任何查询方法,直接继承该接口即可。

    使用QueryDSL构建查询

    现在,我们已经完成了实体类和存储库的创建,可以开始使用QueryDSL来构建查询了。

    配置QueryDSL插件

    首先,我们需要配置QueryDSL插件,以便在编译时生成QueryDSL相关代码。打开pom.xml文件,并添加以下插件配置:

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>com.mysema.mavengroupId>
    5. <artifactId>apt-maven-pluginartifactId>
    6. <version>1.1.3version>
    7. <executions>
    8. <execution>
    9. <goals>
    10. <goal>processgoal>
    11. goals>
    12. <configuration>
    13. <outputDirectory>target/generated-sources/javaoutputDirectory>
    14. <processor>com.querydsl.apt.jpa.JPAAnnotationProcessorprocessor>
    15. configuration>
    16. execution>
    17. executions>
    18. <dependencies>
    19. <dependency>
    20. <groupId>com.querydslgroupId>
    21. <artifactId>querydsl-aptartifactId>
    22. <version>${querydsl.version}version>
    23. dependency>
    24. dependencies>
    25. plugin>
    26. plugins>
    27. build>

    上述配置将QueryDSL插件设置为在编译时处理JPA注解,并将生成的代码输出到target/generated-sources/java目录下。

    创建查询类

    接下来,在项目的包结构中创建一个名为query的包,并在该包中创建一个QUser查询类。该类是由QueryDSL插件生成的,用于表示User实体类的查询属性。代码如下:

    1. package com.example.query;
    2. import com.example.entity.User;
    3. import com.querydsl.core.types.dsl.EntityPathBase;
    4. import com.querydsl.core.types.dsl.PathBuilderFactory;
    5. import com.querydsl.jpa.impl.JPAQueryFactory;
    6. public class QUser extends EntityPathBase {
    7. public static final QUser user = new QUser("user");
    8. public final NumberPath id = createNumber("id", Long.class);
    9. public final StringPath username = createString("username");
    10. public final StringPath email = createString("email");
    11. public QUser(String variable) {
    12. super(User.class, variable);
    13. }
    14. public QUser(PathBuilderFactory pathBuilderFactory, String variable) {
    15. super(User.class, variable, pathBuilderFactory.create(User.class));
    16. }
    17. public static JPAQueryFactory queryFactory() {
    18. return new JPAQueryFactory(DATABASE_CONNECTION);
    19. }
    20. }

    QUser类继承自EntityPathBase,这是QueryDSL提供的基础查询类。我们可以通过定义属性来描述实体类和属性之间的关系。

    注意,QUser类还包含了一个静态方法queryFactory(),用于创建JPAQueryFactory实例,它是查询的入口点。

    使用案例

    现在,我们已经完成了整合Spring Data JPA和QueryDSL的准备工作,可以编写一个使用案例来演示它们的用法。

    编写控制器

    首先,在项目的包结构中创建一个名为controller的包,并在该包中创建一个UserController控制器类。代码如下:

    1. package com.example.controller;
    2. import com.example.entity.User;
    3. import com.example.query.QUser;
    4. import com.example.repository.UserRepository;
    5. import com.querydsl.core.types.dsl.BooleanExpression;
    6. import com.querydsl.jpa.impl.JPAQuery;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.GetMapping;
    9. import org.springframework.web.bind.annotation.PathVariable;
    10. import org.springframework.web.bind.annotation.RequestMapping;
    11. import org.springframework.web.bind.annotation.RestController;
    12. @RestController
    13. @RequestMapping("/users")
    14. public class UserController {
    15. @Autowired
    16. private UserRepository userRepository;
    17. @GetMapping("/{id}")
    18. public User getUserById(@PathVariable Long id) {
    19. return userRepository.findById(id).orElse(null);
    20. }
    21. @GetMapping("/username/{username}")
    22. public User getUserByUsername(@PathVariable String username) {
    23. QUser qUser = QUser.user;
    24. BooleanExpression expression = qUser.username.eq(username);
    25. JPAQuery query = qUser.createQuery();
    26. return query.where(expression).fetchOne();
    27. }
    28. }

    UserController控制器类包含了两个请求处理方法:getUserById()getUserByUsername()。这些方法分别通过ID和用户名进行用户查询。

    运行应用程序

    最后,我们将启动应用程序并测试API接口。你可以使用Postman或类似工具发送HTTP请求,例如:

    结论

    通过整合Spring Data JPA和QueryDSL,我们可以更灵活地构建和执行数据库查询。在本文中,我们讨论了如何使用Spring Boot创建一个基于Spring Data JPA和QueryDSL的应用程序,并提供了一个简单的使用案例来演示其用法。

    希望本文对你有所帮助!如有任何疑问,请随时询问。

  • 相关阅读:
    idea设置字体大小快捷键 Ctrl+鼠标上下滑 字体快捷键缩放设置
    【李沐深度学习笔记】损失函数
    抖音视频评论数据提取软件|抖音数据抓取工具
    (6)SpringCloud-Spring Boot项目详细搭建步骤
    Django学习笔记-实现聊天系统
    自动化方案不合理的原因浅析
    算法-动态规划-最长递增子序列
    VC++程序崩溃时,使用Visual Studio静态分析dump文件
    E. Iva & Pav -前缀和 + 二分 +位运算
    搞懂 MySql 的架构和执行流程
  • 原文地址:https://blog.csdn.net/weixin_52721608/article/details/132743605