noprianto
noprianto
. 5 min read

Operasi CRUD Menggunakan Spring Boot JPA

Bismillah,
Postingan sebelumnya sudah membahas mengenai operasi CRUD menggunakan Spring Boot JDBC, di sana kita sudah dimanjakan dengan template crud oleh Spring menggunakan class JdbcTemplate dan JdbcDaoSupport. Sebenarnya masih ada kekurangan, yaitu kita tetap harus menuliskan query ke dalam database. Dengan adanya kekurangan tersebut akan tersebut munculnya Java Persistance API(JPA), ketika menggunakan JPA kita tidak membutuhakan query pada umumnya tetapi yang digunakan adalah query ke sebuah objek. Beberapa yang akan kita bahas adalah sebagai berikut

Konfigurasi Spring Boot JPA

Untuk melakukan konfigurasi tidak jauh beda dengan yang sebelumnya yaitu saya menggunakan IntelliJ IDEA, atau Anda bisa menggunakan versi web untuk membuat project Spring Boot menggunakan Spring Initialzr di sini. Beberapa library yang dibutuhkan adalah Spring Data JPA, MySQL Driver, dan Lombok. Potongan file pom.xml adalah sebagai berikut

...
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</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>
...

Konfigurasi File Properties

Selain file pom.xml, file konfigurasi yang sangat penting adalah file application.properties yang terdapat di dalam folder resources. File tersebut berfungsi untuk mengkonfigurasi perilaku aplikasi Spring Boot ketika berjalan, isi dari file kurang lebih seperti di bawah ini

spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:mysql://localhost:3306/akademik?useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

Penjelasan dari maksud konfigurasi di atas adalah sebagai berikut

  • spring.jpa.hibernate.ddl-auto=validate, berarti struktur mapping class entitas dengan database divalidasi. Ketika tidak sesuai maka akan menunjukkan error ketika dijalankan.
  • spring.jpa.show-sql=true, query akan ditampilkan pada output ketika melakukan operasi database.
  • spring.jpa.properties.hibernate.format_sql=true, query akan terlihat lebih rapi identasinya.

Pembuatan Entitas

Karena kita akan membuat CRUD yang berkaitan dengan akademik, contohnya adalah entitas mahasiswa sehingga entitas yang akan dibuat adalah sebagai berikut

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.Id;

@Getter
@Setter
@Entity
public class Mahasiswa {
    @Id
    private String nim;
    private String nama;
    private String jurusan;
    private float ipk;
}

Penjelasan dari kode di atas adalah sebagai berikut

  • Anotasi @Getter dan @Setter digunakan untuk menyediakan method Getter dan Setter tanpa kita membuatnya, karena telah disediakan oleh Lombok.
  • @Entitas, berarti bahwa class Mahasiswa adalah sebuah entitas yang akan dimapping ke dalam tabel mahasiswa pada database. Ketika nama tabel dibuat sama dengan nama entitas, kita tidak perlu menambahkan anotasi @Table ditambahkan property nama tabel.
  • @Id merupakan identifier atau primary key dalam entitas mahasiswa, identifier tersebut wajib hukumnya.

Pembuatan Repository

Selain pada entitas yang beda dari sebelumnya, perbedaan yang sangat mencolok adalah pada bagian ini. Jika yang sebelumnya class ini merupakan class yang mengimplementasi sebuah interface DAO, jika pada class ini tetap sebuah interface yang extends interface CrudRepository. Kodenya seperti di bawah ini

import com.sinaungoding.crud.jpa.entitas.Mahasiswa;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface MahasiswaRepository extends CrudRepository<Mahasiswa, String> {
    public List<Mahasiswa> findByNamaContaining(String nama);
}

Dengan extends interface CrudRepository kita sudah mempunya fungsi-fungsi untuk aplikasi crud yang akan kita bangun, pada interface tersebut terdapat sebuah wrapper yaitu entitas dan tipe data dari field yang dijadikan identifier atau @Id. Tetapi misalkan kita akan menambahkan operasi yang lebih komplek lagi, kita bisa mendefinisikan operasi tersebut. Misalkan kita akan mencari nama mahasiswa yang mengandung kata tertentu, method findByNamaContaining() perlu ditambahkan. Penamaan method menjadi dasar Spring untuk melakukan query objek, tetapi jika mau membuat nama method sesuai selera perlu ditambahkan anotasi @Query di atas method yang Anda buat. Misalkan sebagai berikut

@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

Perintah di atas digunakan untuk mengambil data user berdasarkan alamat email, query yang dituliskan bukan query sql tetapi query objek.

Testing Aplikasi

Kita akan mencoba aplikasi crud yang telah kita buat menggunakan junit, kode programnya kurang lebih seperti di bawah ini

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaApplicationTests {

    @Autowired
    private MahasiswaRepository mahasiswaRepository;

    @Test
    @Ignore
    public void insertTest() {
        Mahasiswa mahasiswa = new Mahasiswa();
        mahasiswa.setNim("075410100");
        mahasiswa.setNama("Singgih Kuncoro");
        mahasiswa.setIpk(3.50F);
        mahasiswa.setJurusan("Manajemen Informasi");
        Mahasiswa save = mahasiswaRepository.save(mahasiswa);
        assertNotNull(save);
        mahasiswa = new Mahasiswa();
        mahasiswa.setNim("075410101");
        mahasiswa.setNama("Singgih Permana");
        mahasiswa.setIpk(3.54F);
        mahasiswa.setJurusan("Teknologi Informasi");
        save = mahasiswaRepository.save(mahasiswa);
        assertNotNull(save);
    }

    @Test
    @Ignore
    public void getMahasiswaByNimTest() {
        Mahasiswa mhs = mahasiswaRepository.findById("075410099").get();
        assertNotNull(mhs);
    }

    @Test
    @Ignore
    public void getAllMahasiswaTest() {
        Iterable<Mahasiswa> mahasiswas = mahasiswaRepository.findAll();
        List<Mahasiswa> list = new ArrayList<>();
        for (Mahasiswa mahasiswa : mahasiswas) {
            list.add(mahasiswa);
        }
        assertTrue(!list.isEmpty());
    }

    @Test
    public void getMahasiswaByNamaLike() {
        List<Mahasiswa> mahasiswas = mahasiswaRepository.findByNamaContaining("Singgih");
        assertTrue(!mahasiswas.isEmpty());
    }

}

Jika semuanya normal, method getMahasiswaByNamaLike() ketika dijalankan stautsnya “passed”. Tampilan di tab run editor kira-kira terdapat log seperti di bawah ini

...
Hibernate: 
    select
        mahasiswa0_.nim as nim1_0_,
        mahasiswa0_.ipk as ipk2_0_,
        mahasiswa0_.jurusan as jurusan3_0_,
        mahasiswa0_.nama as nama4_0_ 
    from
        mahasiswa mahasiswa0_ 
    where
        mahasiswa0_.nama like ? escape ?
...

Output di atas karena pada file application.properties telah ditambahkan spring.jpa.show-sql=true dan spring.jpa.properties.hibernate.format_sql=true. Bagaimana mudah bukan untuk membuat aplikasi CRUD menggunakan Spring Boot JPA? Full kode dapat Anda dapatkan di sini.

Demikianlah tulisan saya tentang penggunakan Spring Data JPA menggunakan Spring Boot, semoga tulisan saya bermanfaat. Saran dan kiritik sangat diharapkan untuk memperbaiki blog ini. ^_^

Referensi

comments powered by Disqus