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\"")
}
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()")
}
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()")
}
169. Membaca Data (QueryContext & QueryRowContext)
SELECT multi-baris dengan QueryContext dan single-row dengan QueryRowContext.
Query Data
db.QueryContext()— multiple rows, looprows.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)")
}
170. SQL Injection & Parameterized Queries
Bahaya SQL Injection dan cara mengamankan dengan placeholder ?.
SQL Injection
"SELECT * FROM users WHERE name='" + input + "'"
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)")
}
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()")
}
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)")
}
}
173. Repository Pattern & Clean Architecture
Arsitektur profesional memisahkan layer Database dari layer Bisnis.
Repository Pattern
- 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)")
}