Kodeloka
  1. Kodeloka
  2. Kelas Golang
  3. Materi

Domain 15 · 8 bab

Database & MySQL

166. Pengenalan Package database/sql & Driver

Arsitektur pengelolaan database Relasional di Go.

database/sql

Package standar interface seragam untuk MySQL, PostgreSQL, SQLite. Memerlukan driver: import _ "github.com/go-sql-driver/mysql".

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("database/sql = interface standar RDBMS di Go")
	fmt.Println("Driver MySQL: import _ \"github.com/go-sql-driver/mysql\"")
}

Praktik dan kuis bab ini di kelas interaktif →

167. Koneksi Database & Connection Pool

Format DSN, sql.Open(), db.Ping(), dan konfigurasi Connection Pool.

Koneksi & Pool

DSN: user:pass@tcp(host:3306)/db. sql.Open() membuat pool, db.Ping() verifikasi koneksi fisik.

  • SetMaxOpenConns(100)
  • SetMaxIdleConns(10)
  • SetConnMaxLifetime(30 * time.Minute)

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("DSN: root:password@tcp(127.0.0.1:3306)/mydb")
	fmt.Println("db, err := sql.Open(\"mysql\", dsn)")
	fmt.Println("err = db.Ping()")
}

Praktik dan kuis bab ini di kelas interaktif →

168. Eksekusi SQL Write (db.ExecContext)

INSERT, UPDATE, DELETE dengan db.ExecContext().

db.ExecContext

Untuk SQL yang tidak mengembalikan baris: INSERT, UPDATE, DELETE, CREATE TABLE.

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("INSERT: db.ExecContext(ctx, \"INSERT INTO users(name) VALUES(?)\", name)")
	fmt.Println("Hasil: result.LastInsertId(), result.RowsAffected()")
}

Praktik dan kuis bab ini di kelas interaktif →

169. Membaca Data (QueryContext & QueryRowContext)

SELECT multi-baris dengan QueryContext dan single-row dengan QueryRowContext.

Query Data

  • db.QueryContext() — multiple rows, loop rows.Next() + rows.Scan()
  • db.QueryRowContext() — single row, langsung .Scan()

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("Multi: rows, _ := db.QueryContext(ctx, \"SELECT * FROM users\")")
	fmt.Println("Loop: for rows.Next() { rows.Scan(&id, &name) }")
	fmt.Println("Single: db.QueryRowContext(ctx, \"... WHERE id=?\", id).Scan(&name)")
}

Praktik dan kuis bab ini di kelas interaktif →

170. SQL Injection & Parameterized Queries

Bahaya SQL Injection dan cara mengamankan dengan placeholder ?.

SQL Injection

⛔ JANGAN:

"SELECT * FROM users WHERE name='" + input + "'"

✅ LAKUKAN:

db.QueryContext(ctx, "SELECT * FROM users WHERE name=?", input)

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("=== CARA AMAN ===")
	fmt.Println("Gunakan placeholder '?' dan kirim variabel terpisah")
	fmt.Println("db.QueryContext(ctx, \"SELECT * FROM users WHERE email=?\", email)")
}

Praktik dan kuis bab ini di kelas interaktif →

171. Database Transactions (BeginTx, Commit, Rollback)

Menjamin prinsip ACID dengan transaksi database.

Transaksi Database

Sekumpulan SQL dieksekusi secara Atomic. Jika 1 gagal, seluruh perubahan di-Rollback.

tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback()
tx.ExecContext(...)
tx.Commit()

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("=== TRANSACTION ===")
	fmt.Println("1. tx, _ := db.BeginTx(ctx, nil)")
	fmt.Println("2. defer tx.Rollback()")
	fmt.Println("3. tx.ExecContext(...)")
	fmt.Println("4. tx.Commit()")
}

Praktik dan kuis bab ini di kelas interaktif →

172. Prepared Statements & Nullable Columns

Optimasi query berulang dengan PrepareContext dan handling NULL dengan sql.NullString.

Prepared Statement

db.PrepareContext(ctx, query) mengompilasi query plan sekali. sql.NullString / sql.NullInt64 untuk kolom nullable.

Contoh program

package main

import (
	"database/sql"
	"fmt"
)

func main() {
	var name sql.NullString
	name.Valid = false
	if name.Valid {
		fmt.Println("Name:", name.String)
	} else {
		fmt.Println("Name: (NULL)")
	}
}

Praktik dan kuis bab ini di kelas interaktif →

173. Repository Pattern & Clean Architecture

Arsitektur profesional memisahkan layer Database dari layer Bisnis.

Repository Pattern

🏆 Clean Architecture
  • Entity: Struct model data
  • Repository: Interface + impl query SQL
  • Service: Logika bisnis
  • Controller: HTTP handler

Contoh program

package main

import "fmt"

func main() {
	fmt.Println("==========================================")
	fmt.Println(" SELAMAT MENYELESAIKAN DOMAIN DATABASE! ")
	fmt.Println("==========================================")
	fmt.Println("Domain 1: Fondasi Bahasa Go (1-52)")
	fmt.Println("Domain 2: Standard Library (53-74)")
	fmt.Println("Domain 3: Go Modules & Dependency (75-80)")
	fmt.Println("Domain 4: Golang Generics (81-88)")
	fmt.Println("Domain 5: Unit Testing & Benchmark (89-98)")
	fmt.Println("Domain 6: Goroutines & Concurrency (99-109)")
	fmt.Println("Domain 7: Package Context (110-114)")
	fmt.Println("Domain 8: Go Modern (1.21 - 1.26) (115-118)")
	fmt.Println("Domain 9: Golang JSON (119-127)")
	fmt.Println("Domain 10: Golang Logging (128-135)")
	fmt.Println("Domain 11: Golang Embed (136-141)")
	fmt.Println("Domain 12: Golang Viper Configuration (142-149)")
	fmt.Println("Domain 13: Golang Validation (150-157)")
	fmt.Println("Domain 14: Golang Dependency Injection (158-165)")
	fmt.Println("Domain 15: Database & MySQL (166-173)")
}

Praktik dan kuis bab ini di kelas interaktif →