在 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 埠上執行,這時你會發現專案的輸出,該專案可以生成示例使用者,插入的資料可以顯示輸出。