Dapper .NET Micro-ORM Part 1

Posted by Kamarudin • 4 minute read • Comments

Sudah lama saya ingin mengembangkan aplikasi menggunakan tool-tool ORM seperti ADO.NET Entity Framework, MyBatis, LINQ to SQL, NHibernate dan tool ORM lainnya.

Sempat sedikit serius untuk mempelajari NHibernate tapi… dengan alasan sok sibuk :grin: akhirnya stop ditengah jalan :frowning:.

Masih belum menyerah saya pun mencoba mencari alternatif lain penggunaan tool ORM dengan melakukan pencarian  menggunakan keyword “micro orm for .net” dari sekian banyak pilihan micro ORM yang ada pilihan saya jatuh ke Dapper .NET dengan pertimbangan micro ORM ini sudah digunakan oleh website besar seperti Stack Overflow, xpfest.com, helpdesk, worldcitycard, roadmap.

Dapper .NET sendiri dibuat oleh om Sam Saffron salah seorang developer berbakat yang ada di belakang Stack Overflow.

Sebelum menggunakan Dapper .NET kita lihat dulu bagaimana mengakses database menggunakan library ADO .NET secara langsung.

Contoh kasusnya sederhana kita akan menampilkan data Siswa dengan menggunakan bahasa pemrograman C# dan VB.NET sedangkan untuk databasenya menggunakan Ms Access.

07022013-2

using System.Data.OleDb;

namespace SiswaDapperNET1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = GetOpenConnection())
            {
                var strSql = "SELECT nis, nama FROM siswa";
                using (var cmd = new OleDbCommand(strSql, conn))
                {
                    using (var dtr = cmd.ExecuteReader())
                    {
                        Console.WriteLine("NIS\tNAMA");
                        Console.WriteLine("===================================");
                        while (dtr.Read())
                        {
                            Console.WriteLine(dtr["nis"] + "\t" + dtr["nama"].ToString().ToUpper());
                        }
                    }
                }
            }

            Console.ReadKey();
        }
    }
}

atau jika Anda menggunakan VB.NET kodenya akan terlihat seperti berikut :

Sub Main()

    Using conn As OleDbConnection = GetOpenConnection()

        Dim strSql = "SELECT nis, nama FROM siswa"
        Using cmd = New OleDbCommand(strSql, conn)
            Using dtr As OleDbDataReader = cmd.ExecuteReader()

                Console.WriteLine ("NIS" & vbTab & "NAMA")
                Console.WriteLine ("===================================")
                While dtr.Read()
                    Console.WriteLine (dtr("nis") & vbTab & dtr("nama"))
                End While

            End Using
        End Using
    End Using

End Sub

Method Main di atas membutuhkan method GetOpenConnection yang digunakan untuk membuat koneksi ke database Ms Access.

private static OleDbConnection GetOpenConnection()
{
    OleDbConnection conn = null;

    try
    {

        var appDir = System.IO.Directory.GetCurrentDirectory();
        var strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + appDir + "\\SISWA.MDB;User Id=admin;Password=;";

        conn = new OleDbConnection(strConn);
        conn.Open();
    }
    catch (Exception)
    {
    }

    return conn;
}

dan untuk programmer VB.NET

Private Function GetOpenConnection() As OleDbConnection
    Dim conn As OleDbConnection = Nothing

    Dim appDir As String = System.IO.Directory.GetCurrentDirectory()
    Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + appDir + "\SISWA.MDB;User Id=admin;Password=;"

    Try

        conn = New OleDbConnection(strConn)
        conn.Open()

    Catch ex As Exception

    End Try

    Return conn
End Function

Selanjutnya kita akan memberikan sedikit sentuhan OOP terhadap kode di atas dengan melakukan mapping/pemetaan baris/row dari tabel menjadi objek.

Perhatikan ilustrasi berikut :

26022013-3

Mapping bisa dilakukan secara manual atau menggunakan tool ORM (Object Relational Mapping).

Untuk contoh di bawah ini kita melakukan mapping secara manual, tetapi sebelumnya kita harus membuat sebuah class terlebih dulu yang disebut dengan class entity/model.

Class ini merupakan representasi dari tabel-tabel yang ada di dalam sebuah database.

Berdasarkan tabel Siswa di atas, kita akan membuat sebuah class dengan nama Siswa, field/property dari class ini sama persis dengan field-field yang ada di tabel Siswa.

Untuk kode lengkapnya seperti berikut :

public class Siswa
{
    public string Nis { get; set; }
    public string Nama { get; set; }
}

Jika menggunakan VB.NET kodenya terlihat lebih banyak :grin:

Public Class Siswa

    Private _nis As String
    Public Property Nis() As String
        Get
            Return _nis
        End Get
        Set(ByVal value As String)
            _nis = value
        End Set
    End Property

    Private _nama As String
    Public Property Nama() As String
        Get
            Return _nama
        End Get
        Set(ByVal value As String)
            _nama = value
        End Set
    End Property

End Class

Kemudian kita juga akan menambahkan sebuah method baru dengan nama GetDataSiswa, method ini akan mengembalikan kumpulan (collection) dari data siswa.

private static List<Siswa> GetDataSiswa()
{
    var daftarSiswa = new List<Siswa>();

    using (var conn = GetOpenConnection())
    {
        var strSql = "SELECT nis, nama FROM siswa";
        using (var cmd = new OleDbCommand(strSql, conn))
        {
            using (var dtr = cmd.ExecuteReader())
            {
                while (dtr.Read())
                {
                    // proses mapping dari row ke object
                    var siswa = new Siswa();
                    siswa.Nis = dtr["nis"] == null ? string.Empty : dtr.GetString(0);
                    siswa.Nama = dtr["nama"] == null ? string.Empty : dtr.GetString(1).ToUpper();

                    daftarSiswa.Add(siswa);
                }
            }
        }
    }

    return daftarSiswa;
}

sementara di VB.NET akan terlihat seperti berikut :

Private Function GetDataSiswa() As List(Of Siswa)

    Dim daftarSiswa As New List(Of Siswa)

    Using conn As OleDbConnection = GetOpenConnection()

        Dim strSql = "SELECT nis, nama FROM siswa"
        Using cmd = New OleDbCommand(strSql, conn)
            Using dtr As OleDbDataReader = cmd.ExecuteReader()

                While dtr.Read()
                    Dim siswa As New Siswa()
                    With siswa
                        .Nis = IIf(IsDBNull(dtr("nis")), String.Empty, dtr("nis").ToString())
                        .Nama = IIf(IsDBNull(dtr("nama")), String.Empty, dtr("nama").ToString())
                    End With

                    daftarSiswa.Add (siswa)
                End While

            End Using
        End Using
    End Using

    Return daftarSiswa

End Function

Terakhir kita akan melakukan revisi terhadap method Main diatas.

static void Main(string[] args)
{
    /*
    using (var conn = GetOpenConnection())
    {
        var strSql = "SELECT nis, nama FROM siswa";
        using (var cmd = new OleDbCommand(strSql, conn))
        {
            using (var dtr = cmd.ExecuteReader())
            {
                Console.WriteLine("NIS\tNAMA");
                Console.WriteLine("===================================");
                while (dtr.Read())
                {
                    Console.WriteLine(dtr["nis"] + "\t" + dtr["nama"].ToString().ToUpper());
                }
            }
        }
    }
    */

    Console.WriteLine("NIS\tNAMA");
    Console.WriteLine("===================================");

    var daftarSiswa = GetDataSiswa();
    foreach (var siswa in daftarSiswa)
    {
        Console.WriteLine(siswa.Nis + "\t" + siswa.Nama);
    }

    Console.ReadKey();
}

sekali lagi di VB.NET :

Sub Main()

    'Using conn As OleDbConnection = GetOpenConnection()

    '    Dim strSql = "SELECT nis, nama FROM siswa"
    '    Using cmd = New OleDbCommand(strSql, conn)
    '        Using dtr As OleDbDataReader = cmd.ExecuteReader()

    '            Console.WriteLine("NIS" & vbTab & "NAMA")
    '            Console.WriteLine("===================================")
    '            While dtr.Read()
    '                Console.WriteLine(dtr("nis") & vbTab & dtr("nama"))
    '            End While

    '        End Using
    '    End Using
    'End Using

    Console.WriteLine ("NIS" & vbTab & "NAMA")
    Console.WriteLine ("===================================")

    Dim daftarSiswa = GetDataSiswa()

    For Each siswa In daftarSiswa
        Console.WriteLine (siswa.Nis & vbTab & siswa.Nama)
    Next

    Console.ReadKey()

End Sub

Jika program di atas dijalankan akan menghasilkan output seperti berikut :

07022013

Untuk penggunaan micro ORM Dapper .NET, insyaAllah akan kita mulai pembahasannya pada postingan berikutnya :grin:.

Selamat MENCOBA :blush:

Comments