Spring Boot 應用程式中的 QueryDSL

banq發表於2024-03-07

在 Spring Boot 中,QueryDSL可以被定義為查詢域特定語言,它是一個可以提供型別安全的方式在 Java 中構造查詢的框架。它可以讓開發人員能夠流暢、簡潔地編寫基於字串的查詢,例如 SQL 注入漏洞和缺乏編譯時安全的 QueryDSL 生成基於資料庫模式的查詢類和實體類。

關鍵術語

  • QueryDSL:這代表查詢域特定語言,它是一個可以提供型別安全的方式來在 Java 中構造查詢的框架。
  • 查詢類:它是一個預定義的類,可以表示可以對資料庫執行的查詢,它根據域模型和資料庫模式生成類。
  • 查詢實體:它可以表示資料庫表或檢視,並且可以根據JPA實體註釋生成實體類。
  • 表示式:QueryDSL 中的表示式可以表示可在查詢中使用的值或函式。
  • Path:可以表示實體的欄位屬性,可以用來引用查詢中的列。它可用於構建謂詞和表示式。

Spring Boot應用中QueryDSL的實現
我們可以開發 Spring 應用程式,該應用程式可以將員工 CSV 檔案作為輸入,該 CSV 檔案包含姓名和工資,然後 QueryDSL 可以處理該檔案,然後生成可以計算員工獎金的輸出 CSV。

步驟1:我們可以使用Spring STS IDE建立spring專案,並將下面提到的依賴項新增到專案中。

依賴:

  • Spring Data for JPA
  • Spring Web
  • Lombok
  • Spring Dev Tools

   <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <scope>provided</scope>
            <classifier>jakarta</classifier>
            <version>${querydsl.version}</version>
        </dependency>
        <!-- https:<font>//mvnrepository.com/artifact/com.mysema.maven/apt-maven-plugin --><i>
        <dependency>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>1.1.3</version>
        </dependency>

 <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>
            </plugin>

第 2 步:建立 sql 檔案,命名為 schema-h2.sql,為 sql 資料庫的使用者建立表。

進入 src > resources > schema-h2.sql,輸入以下程式碼。

CREATE TABLE user_seq  (
                      id BIGINT AUTO_INCREMENT PRIMARY KEY,
                      name VARCHAR(255) NOT NULL, -- Adding NOT NULL constraint
                      age INT
);

步驟 3:建立 SQL 檔案,命名為 data-h2.sql,可將資料插入 SQL 資料庫的使用者表中。

進入 src > resources > data-h2.sql,輸入以下程式碼:

INSERT INTO user_seq (name, age) VALUES ('Mahesh Kadambala', 21);
INSERT INTO user_seq (name, age) VALUES ('Eswar Betha', 22);
INSERT INTO user_seq (name, age) VALUES ('Jagan Mall', 25);
INSERT INTO user_seq (name, age) VALUES ('Ruchitha', 22);
INSERT INTO user_seq (name, age) VALUES ('Sirisha', 26);
INSERT INTO user_seq (name, age) VALUES ('Hema Nookeswari', 21);
INSERT INTO user_seq (name, age) VALUES ('tarun', 25);
INSERT INTO user_seq (name, age) VALUES ('Lohith', 28);
INSERT INTO user_seq (name, age) VALUES ('Deepthi', 22);
INSERT INTO user_seq (name, age) VALUES ('Raju', 29);
INSERT INTO user_seq (name, age) VALUES ('Santhosh', 30);

第 4 步:開啟 application.properties 檔案,輸入以下程式碼,為應用程式配置 MongoDb 資料庫和分配伺服器埠。

spring.datasource.url=jdbc:mysql:<font>//localhost:3306/querydsl<i>
spring.datasource.username=root
spring.datasource.password=
server.port=8083
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.main.banner-mode=off
spring.jpa.hibernate.ddl-auto=none
logging.pattern.console=%d{dd-MM-yyyy HH:mm:ss} %magenta([%thread]) %highlight(%-5level) %logger.%M - %msg%n

第 5 步:建立一個新包,命名為 model,在包中建立一個 java 類,命名為 User。

轉到 src > com.gfg.querydslcrudapplication > model > User 並輸入以下程式碼

import jakarta.persistence.*; 
import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 
import java.util.Objects; 

<font>// User class representing a user in the application <i>
@Entity
@Data
@Table(name =
"user_seq"
@AllArgsConstructor
@NoArgsConstructor
public class User { 

    
// Declaring instance variables <i>
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    
    
// User ID <i>
    private Long id; 

    
// User Name <i>
    private String name; 
    
// User Age <i>
    private Integer age; 

    
// Overriding equals method <i>
    @Override
    public boolean equals(Object obj) { 
        
// If objects are the same <i>
        if (this == obj) { 
            return true
        } 
        
        
// If object is null <i>
        if (obj == null) { 
            return false; 
        } 
        
        
// If class types are different <i>
        if (getClass() != obj.getClass()) { 
            return false; 
        } 
        final User other = (User) obj; 
        
        
// 將物件轉換為User型別<i>
       
// 比較例項變數<i>
        if (!Objects.equals(this.id, other.id)) { 
            return false; 
        } 
        if (!Objects.equals(this.name, other.name)) { 
            return false; 
        } 
        return Objects.equals(this.age, other.age); 
    } 

    
// Overriding toString method <i>
    @Override
    public String toString() { 
        
        
// StringBuilder for constructing string representation <i>
        var builder = new StringBuilder(); 
        
        
// Appending instance variables to the builder <i>
        builder.append(
"User{id=").append(id).append(", name=").append(name) 
                .append(
", age=").append(age).append("}"); 
        
        
// Returning the string representation <i>
        return builder.toString(); 
    } 


第 6 步:建立新軟體包,並命名為 repository,在該軟體包中建立名為 UserRepository 的 java 介面。

轉到 src > com.gfg.querydslcrudapplication > repository > UserRepository 並輸入以下程式碼。

import com.gfg.querydslcrudapplication.model.User; 
import org.springframework.data.querydsl.QuerydslPredicateExecutor; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 

<font>// UserRepository interface extending CrudRepository and QuerydslPredicateExecutor <i>
@Repository
public interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> { 


第 7 步:建立名為 MyRunner 的 java 類,該類可以實現 CommandLineRunner。

轉到 src > com.gfg.querydslcrudapplication > MyRunner 並輸入以下程式碼。

import com.gfg.querydslcrudapplication.model.QUser; 
import com.gfg.querydslcrudapplication.repository.UserRepository; 
import com.gfg.querydslcrudapplication.model.User; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.stereotype.Component; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

<font>// MyRunner class implementing CommandLineRunner interface <i>
@Component
public class MyRunner implements CommandLineRunner { 

    
// Initializing Logger instance <i>
    private static final Logger logger = LoggerFactory.getLogger(MyRunner.class); 

    
// Autowiring UserRepository instance <i>
    @Autowired
    private UserRepository userRepository; 

    
// Overriding run() method <i>
    @Override
    public void run(String... args) throws Exception { 
        
// Creating QUser instance <i>
        var qUser = QUser.user; 

        
// Creating and saving initial user <i>
        User initialUser = new User(null,
"John Doe", 30); 
        initialUser = userRepository.save(initialUser); 
        
// Logging initial user insertion <i>
        logger.info(
"Initial user inserted: {}", initialUser); 

        
// Generating and saving 25 sample users <i>
        List<User> sampleUsers = generateSampleUsers(25); 
        sampleUsers = (List<User>) userRepository.saveAll(sampleUsers); 
        
// Logging sample users insertion <i>
        logger.info(
"25 sample users inserted: {}", sampleUsers); 

        
// 查詢年齡小於 29 歲、姓名以 "est "結尾的使用者<i>
        List<User> users = (List<User>) userRepository.findAll( 
                qUser.name.endsWith(
"est").and(qUser.age.lt(29)) 
        ); 
        
// Logging users query result <i>
        logger.info(
"Users with age less than 29 and name ending with 'est': {}", users); 

        
// 查詢年齡大於或等於 30 歲的使用者<i>
        List<User> usersWithAgeAbove30 = (List<User>) userRepository.findAll( 
                qUser.age.goe(30) 
        ); 
        
// Logging users query result <i>
        logger.info(
"Users with age greater than or equal to 30: {}", usersWithAgeAbove30); 
    } 

    
// Method to generate sample users <i>
    private List<User> generateSampleUsers(int count) { 
        List<User> users = new ArrayList<>(); 
        Random random = new Random(); 
        for (int i = 0; i < count; i++) { 
            String name =
"User" + (i + 1); 
            int age = random.nextInt(100);
// Random age between 0 and 99 <i>
            users.add(new User(null, name, age)); 
        } 
        return users; 
    } 


步驟 8:開啟主類,輸入以下程式碼。

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

<font>// QueryDslCrudApplication class with main method <i>
@SpringBootApplication
public class QueryDslCrudApplication { 

    
// Main method to run the application <i>
    public static void main(String[] args) { 
        
// Running the application <i>
        SpringApplication.run(QueryDslCrudApplication.class, args); 
    } 



第 9 步:完成 Spring 專案後,將應用程式作為 Spring 專案執行,然後在 8083 埠上執行,這時你會發現專案的輸出,該專案可以生成示例使用者,插入的資料可以顯示輸出。
 

相關文章