Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian · Pelajaran

Penyepaduan Pangkalan Data dengan Slick/Doobie

Pelajari cara menyepadukan pangkalan data ke dalam aplikasi Play menggunakan ORM atau pustaka Scala popular seperti Slick atau Doobie.

Pelajaran 3 daripada 311 langkah

Penyepaduan Pangkalan Data dengan Slick/Doobie ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 3 pelajaran.

Mengapa Mengintegrasikan Pangkalan Data?

Aplikasi web sering perlu menyimpan dan mendapatkan semula data secara berterusan. Data ini mungkin berupa profil pengguna, maklumat produk atau catatan blog.

  • Kekekalan: Data kekal tersedia walaupun selepas aplikasi dimulakan semula.
  • Kebolehskalaan: Mengendalikan jumlah data yang besar dan ramai pengguna serentak.
  • Kebolehpercayaan: Memastikan integriti data dan keupayaan pemulihan.

Mengintegrasikan pangkalan data amat penting untuk mana-mana aplikasi web dinamik yang dibina dengan Play Framework.

Slick & Doobie: Alat Pangkalan Data Scala

Scala menawarkan pustaka yang berkuasa untuk interaksi dengan pangkalan data, dengan Slick dan Doobie sebagai dua pilihan yang popular.

  • Slick: Pustaka Pemetaan Hubungan Fungsian (FRM). Pustaka ini membolehkan anda bekerja dengan pangkalan data secara selamat dari segi jenis dan fungsian, sambil mengabstrakkan SQL.
  • Doobie: Lapisan JDBC fungsian tulen. Pustaka ini memberikan anda kawalan terus terhadap pertanyaan SQL sambil disepadukan dengan paradigma pengaturcaraan fungsian seperti Cats Effect.

Dalam pelajaran ini, kita akan memberi tumpuan kepada Slick kerana tahap abstraksinya yang lebih tinggi sering memudahkan integrasi awal dengan Play Framework.

Menyediakan Slick dalam Play

Mula-mula, tambahkan Slick dan pemacu pangkalan data ke dalam build.sbt anda. Kita akan menggunakan H2, iaitu pangkalan data dalam memori, untuk penyediaan yang mudah.

Kemudian, konfigurasikan sambungan pangkalan data anda dalam 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 Pangkalan Data

Tambahkan baris ini ke dalam conf/application.conf untuk menyediakan pangkalan data H2 dan profil Slick. slick.dbs.default.profile menentukan jenis pangkalan data.

play.db.prototype.slick mentakrifkan templat untuk sambungan pangkalan 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}
}

Mentakrifkan Model Anda (Jadual Slick)

Dalam Slick, anda mewakili jadual pangkalan data sebagai kelas Scala yang melanjutkan slick.jdbc.H2Profile.api.Table. Setiap lajur dipetakan kepada jenis Scala.

Kita mentakrifkan TableQuery untuk setiap jadual, yang menjadi titik permulaan untuk membuat pertanyaan.

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]

Kod: Penciptaan Jadual & Skema

Contoh yang boleh dijalankan ini menunjukkan cara mentakrifkan jadual User dan kemudian mencipta skemanya dalam pangkalan data H2 dalam memori. Kaedah db.run melaksanakan tindakan pangkalan data secara tak segerak.

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()
    }
  }
}

Corak DAO untuk Operasi

Corak Objek Akses Data (DAO) membantu merangkumkan operasi pangkalan data. Corak ini memisahkan logik perniagaan aplikasi anda daripada logik penyimpanannya.

UserDAO akan mengandungi kaedah untuk memasukkan, membuat pertanyaan, mengemas kini dan memadam 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)
  }
}

Kod: Memasukkan & Membuat Pertanyaan Data

Begini cara memasukkan pengguna baharu dan kemudian membuat pertanyaan untuk semua pengguna daripada pangkalan data menggunakan kaedah DAO yang baru kita takrifkan.

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 dalam Play

Dalam aplikasi Play, biasanya anda menyuntik UserDAO ke dalam pengawal menggunakan suntikan kebergantungan. Ini membolehkan tindakan pengawal anda berinteraksi dengan pangkalan data.

Anda akan mengkonfigurasikan DI Play (contohnya, Guice) untuk menyediakan tika 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")))
  }
}

Semakan Ringkas: Jadual Slick

Pertimbangkan kelas case Scala berikut dan pemetaan Table Slick yang ditakrifkan sebahagiannya:

case class Product(id: Option[Int], name: String, price: Double)

Baris manakah yang melengkapkan unjuran * untuk jadual Product dengan betul, dengan andaian lajur id, name dan price telah ditakrifkan?

Ulang Kaji: Integrasi Pangkalan Data

Dalam pelajaran ini, kita meneroka cara mengintegrasikan pangkalan data ke dalam aplikasi Play Framework menggunakan Slick.

  • Kita mempelajari peranan Slick sebagai pustaka Pemetaan Hubungan Fungsian (FRM).
  • Kita membincangkan penyediaan kebergantungan Slick dan konfigurasi pangkalan data dalam application.conf.
  • Anda melihat cara mentakrifkan case class Scala dan memetakannya kepada jadual pangkalan data menggunakan kelas Table Slick.
  • Kita memperkenalkan corak DAO untuk menyusun operasi pangkalan data serta memberikan contoh memasukkan dan membuat pertanyaan data.
  • Akhir sekali, kita menyentuh integrasi operasi DAO ini ke dalam pengawal Play untuk titik akhir API web.

Menguasai integrasi pangkalan data ialah kunci untuk membina aplikasi Play yang kukuh dan dipacu data!

Percuma untuk bermula

Pelajari Scala dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
143

Soalan Lazim

Adakah pelajaran “Penyepaduan Pangkalan Data dengan Slick/Doobie” percuma?

Ya — teks penuh “Penyepaduan Pangkalan Data dengan Slick/Doobie” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Penyepaduan Pangkalan Data dengan Slick/Doobie”?

Pelajari cara menyepadukan pangkalan data ke dalam aplikasi Play menggunakan ORM atau pustaka Scala popular seperti Slick atau Doobie. Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.

Berapa lamakah pelajaran “Penyepaduan Pangkalan Data dengan Slick/Doobie” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?

Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas Play Framework
  2. Membina API RESTful dengan Play
  3. Penyepaduan Pangkalan Data dengan Slick/Doobie
← Kembali ke Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian