scala 操作数据库的方法

yizhihongxing

Scala操作数据库的方法

Scala是一门面向对象的静态类型编程语言,和Java一样,也是常用语言之一。Scala在Java语言基础上融入了面向对象和函数式编程的特性,并且Scala具有更为简洁的语法设计,在Java编写的代码中,依赖于Hibernate、Mybatis等ORM框架将内存中的类实例映射到数据库中,而Scala语言一般会使用Slick框架来进行数据库操作。

1. 配置依赖

Scala访问数据库,需要导入需要的依赖包。

libraryDependencies += "com.typesafe.slick" %% "slick" % "3.3.3"
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.3.3"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.47"

2. 建立连接

使用Database.forConfig方法连接数据库,这里以MySQL为例。

import slick.jdbc.MySQLProfile.api._
import scala.concurrent.ExecutionContext.Implicits.global

val db = Database.forConfig("mysql")//里面mysql就是application.conf里面写的名字

3. 定义表结构

通过定义case class来定义表结构:

case class User(id: Long, name: String, age: Int)

并且定义对应的表的Table类:

class UserTable(tag: Tag) extends Table[User](tag, "user") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def age = column[Int]("age")
  def * = (id, name, age) <> (User.tupled, User.unapply)
}

4. CRUD操作

使用Slick进行CRUD操作非常简单,只需要组合使用Slick提供的语法即可。

(1)创建表

根据定义好的Table类,使用Slick提供的createIfNotExists().run方法进行建表:

val userTable = TableQuery[UserTable]
db.run(userTable.schema.createIfNotExists)

(2)插入数据

使用+=操作符插入数据:

val user = User(1L, "John Doe", 25)
val insertAction = userTable += user
db.run(insertAction).map { count =>
  println(s"inserted $count rows")
}

(3)查询数据

使用result.headOption查询数据:

val queryAction = userTable.filter(_.id === 1L).result.headOption
db.run(queryAction).map { userOpt =>
  userOpt match {
    case Some(user) => println(user)
    case None => println("no result")
  }
}

(4)更新数据

使用update操作更新数据:

val updateAction = userTable.filter(_.id === 1L).map(_.age).update(32)
db.run(updateAction).map { count =>
  println(s"updated $count rows")
}

(5)删除数据

使用delete操作删除数据:

val deleteAction = userTable.filter(_.id === 1L).delete
db.run(deleteAction).map { count =>
  println(s"deleted $count rows")
}

5. 完整示例

下面是一个完整的示例,演示了如何使用Slick进行数据库操作。

import slick.jdbc.MySQLProfile.api._

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration.Duration

case class User(id: Long, name: String, age: Int)

class UserTable(tag: Tag) extends Table[User](tag, "user") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def age = column[Int]("age")
  def * = (id, name, age) <> (User.tupled, User.unapply)
}

object Main {
  val db = Database.forConfig("mysql")
  val userTable = TableQuery[UserTable]

  // 建表
  def createTable() = {
    val action = userTable.schema.createIfNotExists
    Await.result(db.run(action), Duration.Inf)
  }

  // 插入数据
  def insertData() = {
    val user = User(1L, "John Doe", 25)
    val action = userTable += user
    Await.result(db.run(action), Duration.Inf)
  }

  // 查询数据
  def queryData() = {
    val action = userTable.filter(_.id === 1L).result.headOption
    val userOpt = Await.result(db.run(action), Duration.Inf)
    userOpt match {
      case Some(user) => println(user)
      case None => println("no result")
    }
  }

  // 更新数据
  def updateData() = {
    val action = userTable.filter(_.id === 1L).map(_.age).update(32)
    val count = Await.result(db.run(action), Duration.Inf)
    println(s"updated $count rows")
  }

  // 删除数据
  def deleteData() = {
    val action = userTable.filter(_.id === 1L).delete
    val count = Await.result(db.run(action), Duration.Inf)
    println(s"deleted $count rows")
  }

  def main(args: Array[String]): Unit = {
    createTable()

    insertData()

    queryData()

    updateData()

    deleteData()

    db.close()
  }
}

这是一个使用Slick进行简单数据库操作的例子,Scala在数据库操作上的代码结构和Java有所不同,但是使用起来却更为简单直观,而且代码量也比Java少不少。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:scala 操作数据库的方法 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java策略模式的简单应用实现方法

    接下来我会详细讲解“Java策略模式的简单应用实现方法”的完整攻略。 什么是策略模式? 策略模式是一种行为型设计模式,它允许你定义一组算法,将每个算法都封装起来,并使它们之间可以互换。该模式让算法的变化独立于使用它们的客户端,即可以在不修改客户端代码的情况下更换执行算法。 策略模式的应用场景 当需要在不同情况下使用不同的算法时,可以使用策略模式,将每种算法都…

    Java 2023年5月26日
    00
  • 利用json2POJO with Lombok 插件自动生成java类的操作

    利用json2POJO with Lombok插件自动生成Java类是一个方便快捷的方式,特别是在进行大量API接口开发的时候。下面是使用该插件的完整攻略。 1. 下载插件 首先,需要在Intellij IDEA中安装json2POJO with Lombok插件。可以通过Intellij IDEA的插件市场来搜索和安装该插件。 2. 生成Java类 在In…

    Java 2023年5月26日
    00
  • MyBatis中如何优雅的使用枚举详解

    MyBatis 是一款比较流行的数据层框架,其支持注解以及 XML 方式配置的方式使用。在 MyBatis 中,我们也可以使用 Java 中的枚举来实现一些类似于字典映射的操作。在这篇文章中,我们将深入讨论 MyBatis 中如何优雅的使用枚举来进行数据映射的实现。 枚举类 在 MyBatis 中使用枚举时,我们首先需要创建一个枚举类。该枚举类可以包含一些查…

    Java 2023年5月20日
    00
  • 同步的作用是什么?

    以下是关于同步的作用的完整使用攻略: 同步的作用是什么? 同步是指多个线程之间按照一定的顺序执行,以避免出现数据竞争和一致的情况。在多线程编程中,同步是非常重要的,因为多个线程同时访问共享资源时,可能会导数据的不一致性和程序的错误。 同步的作用 同步的作用主要有以下几个方面: 避免数据竞争:当多个线程同时访问共享资源时可能会导致的不一致性程序的错误。同步可以…

    Java 2023年5月12日
    00
  • spring boot2.0总结介绍

    Spring Boot 2.0 总结介绍 Spring Boot 作为一款基于 Spring 框架的快速开发框架,在各种 Web 应用开发过程中被广泛使用。此次我们将对 Spring Boot 2.0 进行总结介绍,分享如何快速搭建、配置和优化 Spring Boot 2.0。 快速搭建 Spring Boot 2.0 搭建 Spring Boot 2.0 …

    Java 2023年5月15日
    00
  • 如何理解Java内存模型?

    如何理解Java内存模型? Java内存模型(Java Memory Model,JMM)规定了Java程序中多线程执行时,线程之间内存的交互以及对共享数据的访问方式,它是Java程序能否正确运行的重要保障。 Java内存模型的重要概念 主内存和工作内存 Java内存模型中,有两种内存: 主内存(Main Memory):所有线程可以访问共享的内存区域,主内…

    Java 2023年5月11日
    00
  • 图解Java经典算法快速排序的原理与实现

    图解Java经典算法快速排序的原理与实现 一、快速排序的概述 快速排序是一种经典的排序算法,它的时间复杂度为 O(nlogn),在实际应用中被广泛使用。快速排序的思想是通过划分待排序的序列,将序列划分为两个子序列来递归地进行排序。 二、快速排序的实现原理 确定基准元素:从待排序序列中选取一个元素作为基准元素。 分割序列:将所有比基准元素小的元素移到基准元素的…

    Java 2023年5月19日
    00
  • Struts2学习笔记(1)-入门教程

    针对您提出的问题,“Struts2学习笔记(1)-入门教程”的完整攻略,我提供如下回答: Struts2学习笔记(1)-入门教程 什么是Struts2 Struts2是一个MVC框架,它通过过滤器来检测请求,然后将请求分派给特定的Action来处理。在Action中执行完业务逻辑之后,再将结果返回给用户。 安装和配置Struts2 1.从Struts2的官网…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部