Integrasi Basis Data dengan Slick/Doobie
Pelajari cara mengintegrasikan basis data ke dalam aplikasi Play menggunakan ORM atau pustaka Scala populer seperti Slick atau Doobie.
Integrasi Basis Data dengan Slick/Doobie adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 3 pelajaran total.
Mengapa Mengintegrasikan Basis Data?
Aplikasi web sering perlu menyimpan dan mengambil data secara persisten. Data ini dapat berupa profil pengguna, informasi produk, atau kiriman blog.
- Persistensi: Data tetap tersedia bahkan setelah aplikasi dimulai ulang.
- Skalabilitas: Menangani data dalam jumlah besar dan banyak pengguna secara bersamaan.
- Keandalan: Memastikan integritas dan kemampuan pemulihan data.
Mengintegrasikan basis data sangat penting bagi aplikasi web dinamis apa pun yang dibuat dengan Play Framework.
Slick & Doobie: Alat Basis Data Scala
Scala menyediakan pustaka yang kuat untuk berinteraksi dengan basis data, dengan Slick dan Doobie sebagai dua pilihan populer.
- Slick: Pustaka Pemetaan Relasional Fungsional (FRM). Pustaka ini memungkinkan Anda bekerja dengan basis data secara aman dari sisi tipe dan fungsional, sekaligus mengabstraksikan SQL.
- Doobie: Lapisan JDBC fungsional murni. Pustaka ini memberi Anda kendali langsung atas kueri SQL sekaligus terintegrasi dengan paradigma pemrograman fungsional seperti Cats Effect.
Dalam pelajaran ini, kita akan berfokus pada Slick karena abstraksinya yang lebih tinggi sering kali menyederhanakan integrasi awal dengan Play Framework.
Menyiapkan Slick di Play
Pertama, tambahkan Slick dan pengandar basis data ke build.sbt. Kita akan menggunakan H2, yaitu basis data dalam memori, agar penyiapannya mudah.
Kemudian, konfigurasikan koneksi basis data Anda di conf/application.conf.
import play.sbt.PlayImport._
libraryDependencies ++= Seq(
jdbc,
ws,
"com.typesafe.play" %% "play-slick" % "5.0.0",
"com.typesafe.play" %% "play-slick-evolutions" % "5.0.0",
"com.h2database" % "h2" % "2.2.224"
)Konfigurasi Basis Data
Tambahkan baris-baris ini ke conf/application.conf untuk menyiapkan basis data H2 dan profil Slick. slick.dbs.default.profile menentukan jenis basis data.
play.db.prototype.slick mendefinisikan templat untuk koneksi basis data.
slick.dbs.default.profile="slick.jdbc.H2Profile$"
play.db {
prototype.slick = {
db.driver="org.h2.Driver"
db.url="jdbc:h2:mem:play;DB_CLOSE_DELAY=-1"
db.username="sa"
db.password=""
}
# Apply the prototype to our default DB
default = ${play.db.prototype.slick}
}Mendefinisikan Model Anda (Tabel Slick)
Di Slick, Anda merepresentasikan tabel basis data sebagai kelas Scala yang memperluas slick.jdbc.H2Profile.api.Table. Setiap kolom dipetakan ke tipe Scala.
Kita mendefinisikan TableQuery untuk setiap tabel, yang menjadi titik masuk untuk melakukan kueri.
import slick.jdbc.H2Profile.api._
// Define a case class for our data model
case class User(id: Option[Long], name: String, email: String)
// Define the table mapping
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
// Every table needs a * projection with the default mapping
def * = (id, name, email) <> (User.tupled, User.unapply)
}
// TableQuery for accessing the Users table
val users = TableQuery[Users]Kode: Membuat Tabel & Skema
Contoh yang dapat dijalankan ini menunjukkan cara mendefinisikan tabel User, lalu membuat skemanya di basis data H2 dalam memori. Metode db.run menjalankan aksi basis data secara asinkron.
import slick.jdbc.H2Profile.api._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
case class User(id: Option[Long], name: String, email: String)
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
def * = (id, name, email) <> (User.tupled, User.unapply)
}
object SlickDemo {
val users = TableQuery[Users]
def main(args: Array[String]): Unit = {
val db = Database.forURL("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
try {
val setup = DBIO.seq(
users.schema.create
)
val future = db.run(setup)
Await.result(future, 2.seconds)
println("Users table created successfully!")
} finally {
db.close()
}
}
}Pola DAO untuk Operasi
Pola Data Access Object (DAO) membantu mengenkapsulasi operasi basis data. Pola ini memisahkan logika bisnis aplikasi Anda dari logika persistensinya.
UserDAO akan berisi metode untuk menyisipkan, melakukan kueri, memperbarui, dan menghapus objek User.
import slick.jdbc.H2Profile.api._
import scala.concurrent.Future
class UserDAO(db: Database) {
import SlickDemo.users // Assuming users TableQuery is in SlickDemo object
def insert(user: User): Future[User] = {
db.run(users returning users.map(_.id) into ((user, id) => user.copy(id = id)) += user)
}
def findAll(): Future[Seq[User]] = {
db.run(users.result)
}
def findById(id: Long): Future[Option[User]] = {
db.run(users.filter(_.id === id).result.headOption)
}
}Kode: Menyisipkan & Melakukan Kueri Data
Berikut cara menyisipkan pengguna baru, lalu melakukan kueri terhadap semua pengguna dari basis data menggunakan metode DAO yang baru saja kita definisikan.
import slick.jdbc.H2Profile.api._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
case class User(id: Option[Long], name: String, email: String)
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
def * = (id, name, email) <> (User.tupled, User.unapply)
}
class UserDAO(db: Database) {
val users = TableQuery[Users]
def insert(user: User): Future[User] =
db.run(users returning users.map(_.id) into ((u, id) => u.copy(id = id)) += user)
def findAll(): Future[Seq[User]] =
db.run(users.result)
}
object SlickOperations {
def main(args: Array[String]): Unit = {
val db = Database.forURL("jdbc:h2:mem:test2;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
val userDAO = new UserDAO(db)
try {
Await.result(db.run(userDAO.users.schema.create), 2.seconds)
println("Table created.")
val future = for {
user1 <- userDAO.insert(User(None, "Alice", "alice@example.com"))
user2 <- userDAO.insert(User(None, "Bob", "bob@example.com"))
allUsers <- userDAO.findAll()
} yield allUsers
val result = Await.result(future, 5.seconds)
println(s"All users: $result")
} finally {
db.close()
}
}
}Mengintegrasikan DAO ke Play
Dalam aplikasi Play, biasanya Anda menyuntikkan UserDAO ke dalam controller menggunakan injeksi dependensi. Dengan demikian, aksi controller Anda dapat berinteraksi dengan basis data.
Anda perlu mengonfigurasi DI Play (misalnya, Guice) untuk menyediakan instans Database dan UserDAO.
import play.api.mvc._
import play.api.libs.json._
import scala.concurrent.ExecutionContext
import javax.inject._
// Assuming User and UserDAO are defined as before
@Singleton
class UserController @Inject()(cc: ControllerComponents, userDAO: UserDAO)
(implicit ec: ExecutionContext) extends AbstractController(cc) {
def listUsers = Action.async {
userDAO.findAll().map { users =>
Ok(Json.toJson(users))
}
}
def createUser = Action.async(parse.json) {
request =>
request.body.validate[User].map { user =>
userDAO.insert(user).map(u => Created(Json.toJson(u)))
}.getOrElse(Future.successful(BadRequest("Invalid User Data")))
}
}Pemeriksaan Singkat: Tabel Slick
Perhatikan case class Scala berikut dan pemetaan Table Slick yang didefinisikan sebagian:
case class Product(id: Option[Int], name: String, price: Double)Baris manakah yang melengkapi proyeksi * untuk tabel Product dengan benar, dengan asumsi kolom id, name, dan price telah didefinisikan?
Ringkasan: Integrasi Basis Data
Dalam pelajaran ini, kita mempelajari cara mengintegrasikan basis data ke dalam aplikasi Play Framework menggunakan Slick.
- Kita mempelajari peran Slick sebagai pustaka Pemetaan Relasional Fungsional (FRM).
- Kita membahas penyiapan dependensi Slick dan konfigurasi basis data di
application.conf. - Anda melihat cara mendefinisikan case class Scala dan memetakannya ke tabel basis data menggunakan kelas
Tablemilik Slick. - Kita memperkenalkan pola DAO untuk mengatur operasi basis data dan memberikan contoh penyisipan serta kueri data.
- Terakhir, kita membahas secara singkat integrasi operasi DAO tersebut ke dalam controller Play untuk titik akhir API web.
Menguasai integrasi basis data adalah kunci untuk membangun aplikasi Play yang tangguh dan digerakkan oleh data!
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Integrasi Basis Data dengan Slick/Doobie” gratis?
Ya — teks lengkap “Integrasi Basis Data dengan Slick/Doobie” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Integrasi Basis Data dengan Slick/Doobie”?
Pelajari cara mengintegrasikan basis data ke dalam aplikasi Play menggunakan ORM atau pustaka Scala populer seperti Slick atau Doobie. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.
Berapa lama pelajaran “Integrasi Basis Data dengan Slick/Doobie” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Play Framework
- Membangun API RESTful dengan Play
- Integrasi Basis Data dengan Slick/Doobie