scala 操作数据库的方法

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实现折半插入排序算法的示例代码 算法简介 折半插入排序(Binary Insertion Sort)是插入排序算法的一种变体,它通过使用折半查找来减少比较和移动的次数,从而提高算法的效率。算法的时间复杂度为O(n^2)。 示例代码 下面是Java实现折半插入排序算法的示例代码: public static void binaryInsertionSo…

    Java 2023年5月19日
    00
  • springmvc视图解析流程代码实例

    下面我将为大家详细讲解“springmvc视图解析流程代码实例”的完整攻略。 什么是SpringMVC视图解析器? SpringMVC视图解析器指的是一个组件,它用于将控制器返回给客户端的模型数据解析成最终的HTML、JSON、XML等格式的视图响应。在SpringMVC中,视图解析器通常工作在处理器映射器之后,即处理器执行方法之后。 SpringMVC视图…

    Java 2023年6月15日
    00
  • JavaScript Uploadify文件上传实例

    下面是JavaScript Uploadify文件上传实例的完整攻略,主要包括以下几个部分: 1. 环境搭建 在开始之前,需要将环境搭建好,确保能够正常运行。需要安装以下两个组件: jQuery库(版本>=1.7) Uploadify插件(版本>=3.2) 2. HTML结构 在HTML页面中,需要创建一个file input来选择需要上传的文件…

    Java 2023年6月15日
    00
  • Java实现花卉管理系统

    Java实现花卉管理系统攻略 1. 系统需求分析 在实现花卉管理系统前,需要进行系统需求分析,明确要实现什么功能。花卉管理系统需要实现以下功能: 用户可以注册账号、登录、修改密码、注销账号。 用户可以查看花卉品种、价格、产地、剪枝难度等信息。 系统管理员可以添加、删除、修改花卉品种。 用户可以按照花卉品种、价格等条件进行搜索和筛选。 用户可以将花卉加入购物车…

    Java 2023年5月19日
    00
  • 防止xss和sql注入:JS特殊字符过滤正则

    防止 XSS 和 SQL 注入攻击是 web 应用程序开发中非常重要的一部分。在前端中,JavaScript 特殊字符过滤正则表达式可以帮助我们完成这项工作。 下面是一份完整的防止 XSS 和 SQL 注入攻击的攻略: 1. 什么是 XSS 和 SQL 注入攻击 XSS(Cross Site Scripting)攻击是一种恶意代码注入攻击,攻击者使用 Jav…

    Java 2023年6月16日
    00
  • Java 队列实现原理及简单实现代码

    下面就详细讲解“Java队列实现原理及简单实现代码”的完整攻略。 队列基本概念 在讲解队列的实现原理和代码之前,先了解一下队列的基本概念: 队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构。它可以用链表或数组来实现。队列在计算机中广泛应用,例如在操作系统、网络通信、数据库系统等方面经常被使用。 在队列中,新的元素插…

    Java 2023年5月18日
    00
  • Java实现学生管理系统详解流程

    Java实现学生管理系统详解流程 一、系统需求分析 1.1 系统功能需求 添加学生信息 删除学生信息 修改学生信息 查询学生信息 显示所有学生信息 1.2 系统性能需求 界面友好,操作简单明了 对学生信息进行持久化存储,确保数据不会丢失 查询、添加、删除、修改操作均要快速、正确 二、系统设计 2.1 数据库设计 使用MySQL数据库存储学生信息,设计学生表s…

    Java 2023年5月19日
    00
  • java中复杂查询sql语句该怎么写

    讲解如下。 如何在Java中编写复杂查询SQL语句 在Java中编写复杂查询SQL语句通常有两种方式,分别是使用字符串拼接和使用JPA Criteria Query API。下面将对这两种方法进行详细介绍。 字符串拼接 使用字符串拼接方式,我们可以直接写出SQL语句并将其作为一个字符串传递给JDBC,然后通过执行该语句返回结果集。这种方式的优点是简单易懂,可…

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