noprianto
noprianto
. 5 min read

Operasi CRUD Menggunakan Spring Boot JDBC(Bagian 2)

Bismillah,
Sebenarnya postingan kali ini adalah kelanjutan dari postingan sebelumnya, yang mana di dalam postingan tersebut membahas bagaimana Spring menyediakan kemudahan akses ke dalam database. Selain itu, dengan konfigurasi yang sangat sederhana juga. Projek aplikasi yang digunakan dalam artikel ini masih menggunakan projek pada artikel sebelumnya, silakan clone di sini projek tersebut.

Ternyata Spring juga menyediakan magic kembali untuk urusan jdbc yaitu terdapat class JdbcTemplate dan JdbcDaoSupport untuk melakukan operasi-operasi database. Agar terstuktur alur ceritanya saya buat beberapa point seperti berikut

Penggunaan class JdbcTemplate

Class JdbcTemplate merupakan class utama yang terdapat pada paket utama JDBC, fungsi class ini menyederhanakan operasi-operasi dalam database misalkan untuk mendapatkan koneksi ke database atau untuk urusan handle resource dalam database. Contoh penggunaan class JdbcTemplate kurang lebih seperti berikut ini

@Repository
public class MahasiswaRepository implements MahasiswaDao {

    private final String INSERT = "INSERT INTO mahasiswa (nim, nama, ipk, jurusan) "
            + "	VALUES (?,?,?,?)";
    private final String UPDATE = "UPDATE mahasiswa SET nama=?, ipk=?, jurusan=? WHERE nim=?";
    private final String DELETE = "DELETE FROM mahasiswa WHERE nim=?";
    private final String SELECT_ALL = "SELECT nim,nama,ipk,jurusan FROM mahasiswa";
    private final String SELECT_BY_NIM = "SELECT nim,nama,ipk,jurusan FROM mahasiswa WHERE nim=?";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public boolean insert(Mahasiswa mahasiswa) {
        return jdbcTemplate.update(INSERT, new Object[]{mahasiswa.getNim(), mahasiswa.getNama(), mahasiswa.getIpk(), mahasiswa.getJurusan()}) > 0 ? true : false;
    }

    @Override
    public boolean update(Mahasiswa mahasiswa) {
        return jdbcTemplate.update(UPDATE, new Object[]{mahasiswa.getNama(), mahasiswa.getIpk(), mahasiswa.getJurusan(), mahasiswa.getNim()}) > 0 ? true : false;
    }

    @Override
    public boolean delete(Mahasiswa mahasiswa) {
        return jdbcTemplate.update(DELETE, new Object[]{mahasiswa.getNim()}) > 0 ? true : false;
    }

    @Override
    public Mahasiswa getByNim(String nim) {
        return jdbcTemplate.queryForObject(SELECT_BY_NIM, new Object[]{nim}, new MahasiswaRowMapper());
    }

    @Override
    public List<Mahasiswa> getAll() {
        return jdbcTemplate.query(SELECT_ALL, new MahasiswaRowMapper());
    }

    private class MahasiswaRowMapper implements RowMapper<Mahasiswa> {

        @Override
        public Mahasiswa mapRow(ResultSet resultSet, int i) throws SQLException {
            Mahasiswa mahasiswa = new Mahasiswa();
            mahasiswa.setNim(resultSet.getString("nim"));
            mahasiswa.setNama(resultSet.getString("nama"));
            mahasiswa.setJurusan(resultSet.getString("jurusan"));
            mahasiswa.setIpk(resultSet.getFloat("ipk"));
            return mahasiswa;
        }
    }
}

Terlihat kode di atas jauh lebih sederhana ketika menggunakan jdbc biasa, jangan lupa menambahkan @Autowired pada JdbcTemplate agar class tersebut di-instance-kan oleh framework Spring. Kemudian beralih ke operasi insert ke dalam database, hanya 1 baris dari yang sebelumnya lebih dari 10 baris kode. Dalam operasi tersebut tidak membutuhkan instance class Connection, PreparedStatement, ataupun melakukan close instance tersebut. Selanjutnya untuk mengambil data kita perlu me-mapping object dengan membuat class yang diturunkan dari interface RowMapper.

Penggunaan JdbcDaoSupport

Sebenarnya tidak jauh beda dengan class JdbcTemplate fungsinya, perbedaannya adalah pada class ini harus melewatkan datasource ketika init pertama kali. Untuk penggunaan class ini, caranya adalah class yang akan implement class DAO harus extends JdbcDaoSupport. Kodenya dapat dilihat seperti berikut ini

@Repository
public class MahasiswaRepository extends JdbcDaoSupport implements MahasiswaDao {

    private final String INSERT = "INSERT INTO mahasiswa (nim, nama, ipk, jurusan) "
            + "	VALUES (?,?,?,?)";
    private final String UPDATE = "UPDATE mahasiswa SET nama=?, ipk=?, jurusan=? WHERE nim=?";
    private final String DELETE = "DELETE FROM mahasiswa WHERE nim=?";
    private final String SELECT_ALL = "SELECT nim,nama,ipk,jurusan FROM mahasiswa";
    private final String SELECT_BY_NIM = "SELECT nim,nama,ipk,jurusan FROM mahasiswa WHERE nim=?";

    @Autowired
    private DataSource dataSource;

    @PostConstruct
    public void init() {
        setDataSource(dataSource);
    }

    @Override
    public boolean insert(Mahasiswa mahasiswa) {
        return getJdbcTemplate().update(INSERT, new Object[]{mahasiswa.getNim(), mahasiswa.getNama(), mahasiswa.getIpk(), mahasiswa.getJurusan()}) > 0 ? true : false;
    }

    @Override
    public boolean update(Mahasiswa mahasiswa) {
        return getJdbcTemplate().update(UPDATE, new Object[]{mahasiswa.getNama(), mahasiswa.getIpk(), mahasiswa.getJurusan(), mahasiswa.getNim()}) > 0 ? true : false;
    }

    @Override
    public boolean delete(Mahasiswa mahasiswa) {
        return getJdbcTemplate().update(DELETE, new Object[]{mahasiswa.getNim()}) > 0 ? true : false;
    }

    @Override
    public Mahasiswa getByNim(String nim) {
        return getJdbcTemplate().queryForObject(SELECT_BY_NIM, new Object[]{nim}, new MahasiswaRowMapper());
    }

    @Override
    public List<Mahasiswa> getAll() {
        return getJdbcTemplate().query(SELECT_ALL, new MahasiswaRowMapper());
    }

    private class MahasiswaRowMapper implements RowMapper<Mahasiswa> {

        @Override
        public Mahasiswa mapRow(ResultSet resultSet, int i) throws SQLException {
            Mahasiswa mahasiswa = new Mahasiswa();
            mahasiswa.setNim(resultSet.getString("nim"));
            mahasiswa.setNama(resultSet.getString("nama"));
            mahasiswa.setJurusan(resultSet.getString("jurusan"));
            mahasiswa.setIpk(resultSet.getFloat("ipk"));
            return mahasiswa;
        }
    }
}

Terlihat bahwa kita harus @Autowired Datasource, selanjutnya melewatkan pertama kali ketika Spring melakukan scanning dengan memanggil method setDatasource() menggunakan anotasi @PostConstruct. Kemudaian mengambil instance jdbcTemplate dengan memanggil method getJdbcTemplate(), selanjutnya kita melakukan operasi-operasi pada database.

Testing Aplikasi

Untuk melakukan unit test, silakan test method-method yang telah Anda buat. Berikut ini contohnya

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

    @Autowired
    private MahasiswaDao mahasiswaDao;

    @Test
    @Ignore
    public void insertTest() {
        Mahasiswa mahasiswa = new Mahasiswa("075410099", "Noprianto", 3.99F, "Teknik Informatika");
        assertTrue(mahasiswaDao.insert(mahasiswa));
    }

    @Test
    public void getByNimTest() {
        assertNotNull(mahasiswaDao.getByNim("075410099"));
    }

    @Test
    public void getAllTest() {
        assertTrue(!mahasiswaDao.getAll().isEmpty());
    }

}

Jika semuanya normal seharusnya methode getByNimTest() dan getAllTest() statusnya akan Passed ketika unit test dijalankan. Untuk full code silakan dapat Anda dapatkan di sini, jangan lupa disesuaikan untuk branch-nya.

Demikianlah artikel saya mengenai jdbc menggunakan Spring, bagaimana mudah bukan? Semoga bermanfaat dan menambah semangat belajar mengkoding Java. 🙂

Referensi

comments powered by Disqus