Description
Querydsl adalah library Java yang memungkinkan pengembang untuk membuat query database yang aman dan kuat menggunakan sintaks yang deklaratif dan berbasis kode. Dengan Querydsl, pengembang dapat menghasilkan query database dengan menggunakan struktur objek Java, menghindari kesalahan penulisan string SQL dan meningkatkan keamanan dan fleksibilitas query.Kelebihan
1. Sintaks yang deklaratif: Querydsl menggunakan sistaks berbasis kode yang deklaratif untuk membangung query database, sehingga mengurasngi risiko kesalahan penulisan string SQL dan meningkatkan kualitas kode.
2. Tipe Aman: Querydsl menggunakan tipe aman dalam membangun query, yang berarti kesalahan pada waktu kompilasi dapat dideteksi lebih awal dan mengurangi kesalahan pada waktu runtime.
3. Integrasi dengan framework populer: Querydsl dapat dengan mudah diintegrasikan dengan berbagai kerangka kerja populer seperti Spring Framework, Hibernate, JPA, dan lainnya.
4. Dukungan untuk berbagai jenis database: Querydsl mendukung berbagai jenis database seperti Mysql, PostgreSQL, Oracle, dan lainnya sehingga dapat digunakan dalam lingkungan pengembangan yang beragam
5. Fitur-fitur lanjutan: Querydsl juga menyediakan fitur-fitur lanjutan seperti penggabungan query, operasi CRUD, pengurutan dan pembatasan hasil query, yang mempermudah pengembangan aplikasi database yang kompleks.
Kekurangan Querydsl
1. Kurva Belajar: Menggunakan querydsl memerpukan pemahaman yang baik tentang sintaks dan komsepnya, sehingga memerlukan waktu untuk belajar dan mempelajarinya.
2. Performa: Terkadang menggunakan querydsl dapat mempengaruhi performa karena adanya lapisan tambahan antara aplikasi dan database. Namun, pengaruh ini dapat diminimalisir dengan penggunaan yang bijaksana dan pengeoptimalan query yang tepat.
Cara menambahkan Querydsl di Spring Boot
tambahkakn liblary ini pada pom.xml
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
<classifier>jakarta</classifier>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
jika kalian menggunakan java yang dibawah 17 hapus <classifier>jakarta</classifier>
setelah itu tambahkan plugin
<!--Plugin for query-dsl-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
jadinya akan seperti ini
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fluex404</groupId>
<artifactId>spring-boot-querydsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-querydsl</name>
<description>spring-boot-querydsl</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
<classifier>jakarta</classifier>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<!--Plugin for query-dsl-->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Nah sekarang coba configurasi database disini saya menggunakan postgresql tambahkan configurasi ini ke application.yaml, sorry sebelumnya kan applicatoin.properties nah disitu kalian rubah formatnya dulu jadi .yaml biar lebih enak penulisannya kalau udah tambahkan configurasinya
spring:
initialization-mode: always
datasource:
username: postgres
password: password
url: jdbc:postgresql://192.168.8.103:5432/test
jpa:
hibernate:
ddl-auto: update
lalu buat entity disini saya buat tabel simple aja ada 3 yaitu Book, Borow, UserData saya menggunaakn sistem peminjaman buku dimana jika ingin menyimpan data buku taruh di entity Book dan jika ingin menyimpan data User taruh di entity UserData dan jika ingin menyimpan data Peminjaman yang mana ada buku apa yang dipinjam dan user siapa yang pinjam itu di Borrow. buat seperti ini ya guys
import jakarta.persistence.*;
import lombok.*;
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
}
import jakarta.persistence.*;
import lombok.*;
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "userdata")
public class UserData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "borrow")
public class Borrow {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private UserData userData;
@ManyToOne
@JoinColumn(name = "book_id", referencedColumnName = "id")
private Book book;
@Column(columnDefinition = "TIMESTAMPTZ", name = "insert_date")
private LocalDateTime insertDate;
}
lihat kode import diatas saya menggunakan jakarta.persistence.* itu karna saya menggunakan java 17 jika kalian dibawah java 17 itu ganti java.persistence
isi datanya dengan query manual ke database
insert into public.userdata (id, email, name)
values (1, 'abc@gmail.com', 'abc'),
(2, 'test1@gmail.com', 'test1'),
(3, 'test2@gmail.com', 'test2');
insert into public.book (id, author, title)
values (1, 'isa', 'programming with assembly'),
(2, 'josh', 'programming with ep ha ep');
insert into public.borrow (id, book_id, user_id, insert_date)
values (3, 2, 3, '2023-05-20 11:18:09.405000 +00:00'),
(1, 1, 1, '2023-05-14 11:18:07.192000 +00:00'),
(2, 1, 2, '2023-05-19 11:18:12.810000 +00:00');
jika data dan entitynya sudah siap kalian sudah bisa menggunakan querydsl, disini saya mengagunakan unit testing dari spring boot
import com.fluex404.springbootquerydsl.entity.QBook;
import com.fluex404.springbootquerydsl.entity.QBorrow;
import com.fluex404.springbootquerydsl.entity.QUserData;
import com.fluex404.springbootquerydsl.respository.UserDataRepository;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.jpa.impl.JPAQuery;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class SpringBootQuerydslApplicationTests {
@Autowired
UserDataRepository userDataRepository;
@PersistenceContext
private EntityManager entityManager;
@Test
void ngetest_aja() {
System.out.println("NGETEST AJA!");
}
@Test
void ngetest_find_all_userdata() {
var qUserData = QUserData.userData;
var query = new JPAQuery(entityManager);
query.from(qUserData).fetch().forEach(System.out::println);
}
@Test
void ngetest_find_all_userdata_with_where() {
var qUserData = QUserData.userData;
var query = new JPAQuery(entityManager);
query.from(qUserData).where(qUserData.name.like("%test%"));
query.where(qUserData.email.eq("test1@gmail.com"));
query.fetch().forEach(System.out::println);
}
@Test
void ngetest_where_localdatetime() {
var qBorrow = QBorrow.borrow;
var query = new JPAQuery(entityManager);
query.from(qBorrow).where(qBorrow.insertDate.after(LocalDateTime.of(2023, 05, 18, 0, 0, 0))
.and(qBorrow.book.title.eq("programming with assembly")));
query.fetch().forEach(System.out::println);
}
@Test
void ngetest_querydsl_on_repository_userdata() {
var qUserData = QUserData.userData;
userDataRepository.findAll(
qUserData.name.like("%test%"),
qUserData.id.desc()
).forEach(System.out::println);
}
@Test
void ngetest_querydsl_with_pageable() {
var qUserData = QUserData.userData;
userDataRepository.findAll(
PageRequest.of(1, 1, Sort.by("email").descending())
).forEach(System.out::println);
}
@Test
void ngetest_querydsl_with_two_books() {
var book1 = QBook.book;
var book2 = QBook.book;
var query = new JPAQuery(entityManager);
query.from(book1, book2).where(book1.author.eq("isa").or(book2.author.eq("josh")));
query.fetch().forEach(System.out::println);
}
@Test
void cobain_tuple() {
var qBook = QBook.book;
var query = new JPAQuery(entityManager);
NumberPath<Long> aliasKuda = Expressions.numberPath(Long.class, "kuda");
query.select(qBook.id, qBook.title, qBook.author, qBook.id.multiply(100).as(aliasKuda))
.from(qBook)
.orderBy(aliasKuda.desc())
;
// query.fetch().forEach(System.out::println);
List<Tuple> list = query.fetch();
for (Tuple tuple : list) {
System.out.println(tuple);
System.out.println(tuple.get(3, Integer.class));
}
}
@Test
void cobain_Qcustome() {
var qBook = new QBook("book");
var qCustomer = new QBook("customer");
var query = new JPAQuery(entityManager);
query.from(qBook).fetch().forEach(System.out::println);
query.from(qCustomer).fetch().forEach(System.out::println);
}
}
Komentar
Posting Komentar