Langsung ke konten utama

Spring Boot Querydsl

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

Postingan populer dari blog ini

whois

  Pengertian:  whois adalah tools yang digunakan untuk melihat informasi mengenai kepemilikan domain dan website. ICANN meregulasikan domain name dan kepemelikian, tapi record listnya di adakan di semua company dikenal sebagai registrasi.  jadi orang bisa query list of records, dan register akan menghandle request anda dan mengirim detail dari whois record yang sesuai. How to Install whois :  sudo apt-get install whois How to use:  whois cnn.com dan hasilnya akan seperti ini. Domain Name: CNN.COM Registry Domain ID: 3269879_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.corporatedomains.com Registrar URL: http://www.cscglobal.com/global/web/csc/digital-brand-services.html Updated Date: 2018-04-10T16:43:38Z Creation Date: 1993-09-22T04:00:00Z Registry Expiry Date: 2026-09-21T04:00:00Z Registrar: CSC Corporate Domains, Inc. Registrar IANA ID: 299 Registrar Abuse Contact Email: domainabuse@cscglobal.com Registrar Abuse Contact Phone: 8887802723 Domain Status: clien...

Membuat export dan import Excel di spring boot

Membuat export dan import Excel  di spring boot           Adakalanya seorang developer diminta untuk membuat fitur export dan import berbentuk excel dan sebenarnya java sudah menyediakan suatu liblary yang memudahkan kita untuk bekerja dengan MS-Office yaitu Apache POI. Disini saya akan menggunakan Apache POI untuk membaca dan menulis Excel. Catatan : Disini saya sarankan untuk belajar Apache POI Excel terlebih dahulu agar anda mengerti kode yang saya buat di bawah ini. Bahan : -  IntelliJ IDEA -  PostgreSQL -  Maven -  Java 8 Jika sudah tersedia bahan - bahan di atas langsung saja kunjungi situs ini Tambahkan dependency Apache POI di pom.xml seperti di bawah 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 http://maven.apache.org/xsd/maven-4.0.0...

Spring Boot CRUD Thymeleaf-Pagination + Bootstrap Dynamic Modals

Spring Boot CRUD Thymeeaf-Pagination + Bootstrap Dynamic Modals                Sebelumnya saya sudah sharing bagaimana cara membuat Spring Boot CRUD sederhana di artikel sebelumnya yang blum lihat silahkan lihat disini . Sekarang saya akan membuat Spring Boot CRUD lagi ala pagination dan Dynamic Modals dengan bootstrap. Bahan : - IntelliJ IDEA - PostgreSQL - Maven - JDK1.8 Jika bahan nya sudah tersedia agan bisa kunjungi situs resmi spring nya https://start.spring.io/  buat seperti ini lalu download dan exract. Buat database yang bernama "springbootcrud2" disini saya menggunakan pgadmin4. Buka intelliJ atau IDE kesayangan kalian buka file application.properties di dalam resources dan isikan ini untuk configurasi databasenya sesuai kan dengan database kalian lalu save. ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.url = jdbc:postgresql://loc...