SpringBoot项目使用Scala进行Web开发

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文介绍如何在Springboot中使用Scala进行web开发

Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言并集成面向对象编程。Scala把Erlang风格的基于actor的并发带进了JVM,开发者可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,它会自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序,接下来就介绍一下如何在SpringBoot框架中使用Scala来进行简单的Web开发,对scala不了解的建议先去学习基础哦

一、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gjing.project</groupId>
    <artifactId>scala-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>scala-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--加入Scala依赖库-->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.13.1</version>
        </dependency>

        <dependency>
            <groupId>cn.gjing</groupId>
            <artifactId>tools-starter-swagger</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>cn.gjing</groupId>
            <artifactId>tools-common</artifactId>
            <version>1.2.7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--加入Scala的编译插件,否则无法进行编译-->
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

通过上面我们可以发现,和创建Java版本的SpringBoot项目没啥不同,只是引入了scala-library这个我们之前没引入的包,同时增加了对scala编译的插件

二、配置YML文件

server:
  port: 8080
spring:
  application:
    name: scala-demo
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 5
      minimum-idle: 1
      idle-timeout: 30000
      connection-timeout: 30000
  jpa:
    database: mysql
    hibernate:
      ddl-auto: update
    # 设置创表引擎为Innodb,不然默认为MyiSam
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

swagger:
  base-package: com.gjing.project.scala.controller
  title: scala学习的demo

三、创建实体类

import javax.persistence._

import scala.beans.BeanProperty

/**
 * @author Gjing
 **/
@Entity
@Table(name = "scala_customer")
class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @BeanProperty
  var id:Integer = _

  @BeanProperty
  var customerName:String = _

  def this(customerName:String){
    this()
    this.customerName = customerName
  }

  override def toString: String = s"Customer($id,$customerName)"
}

这块和我们用java开发没啥不同,只是@BeanProperty注解会帮我们生成getset

四、Repository层

import com.gjing.project.scala.entity.Customer
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

/**
 * @author Gjing
 **/
@Repository
trait CustomerRepository extends JpaRepository[Customer, Integer] {
  /**
   * 通过用户名查询
   * @param name 用户名
   * @return Customer
   */
  def findByCustomerName(name:String) : Customer
}

这里和JAVA不同的是泛型采用的是[]中括号,这点要注意

五、Service层

import cn.gjing.tools.common.result.PageResult
import com.gjing.project.scala.entity.Customer
import com.gjing.project.scala.exceptions.MyServiceException
import com.gjing.project.scala.repository.CustomerRepository
import javax.annotation.Resource
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service

/**
 * @author Gjing
 **/
@Service
class CustomerService @Resource()(customerRepository: CustomerRepository) {
  /**
   * 保存用户
   *
   * @param name 用户名
   */
  def saveCustomer(name: String): Unit = {
    var customer = customerRepository.findByCustomerName(name)
    if (customer != null) {
      throw MyServiceException("添加失败,用户已存在")
    }
    customer = new Customer(name)
    customerRepository.save(customer)
  }

  /**
   * 分页查询
   *
   * @param pageable 分页对象
   * @return
   */
  def pageCustomer(pageable: Pageable): PageResult[java.util.List[Customer]] = {
    val page = customerRepository.findAll(pageable)
    return PageResult.of(page.getContent, page.getTotalPages, page.getSize, page.getTotalElements, page.getNumber)
  }

  /**
   * 更新用户名
   * @param id 用户id
   * @param name 用户名
   */
  def updateCustomer(id: Integer, name: String): Unit = {
    val customer = customerRepository.findById(id).orElseThrow(() => MyServiceException("更新失败,用户不存在"))
    customer.setCustomerName(name)
    customerRepository.saveAndFlush(customer)
  }

  /**
   * 删除指定用户
   * @param id 用户id
   */
  def deleteCustomer(id:Integer): Unit = {
    val customer = customerRepository.findById(id).orElseThrow(() => MyServiceException("删除失败,用户不存在"))
    customerRepository.delete(customer)
  }
}

有意思的是,在scala中依赖注入是写在类名上的

六、Controller层

import cn.gjing.tools.common.annotation.NotEmpty
import cn.gjing.tools.common.result.PageResult
import com.gjing.project.scala.entity.Customer
import com.gjing.project.scala.service.CustomerService
import io.swagger.annotations.{Api, ApiImplicitParam, ApiImplicitParams, ApiOperation}
import javax.annotation.Resource
import org.springframework.data.domain.PageRequest
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation._

/**
 * @author Gjing
 **/
@RestController
@Api(tags = Array("用户的相关功能"))
class CustomerController @Resource()(customerService:CustomerService){
  @PostMapping(Array("/customer"))
  @ApiOperation("添加用户")
  @ApiImplicitParam(name = "customerName",value = "用户名",dataType = "String",required = true,paramType = "query")
  @NotEmpty
  def saveCustomer(customerName:String): ResponseEntity[String] ={
    customerService.saveCustomer(customerName)
    ResponseEntity.ok("添加成功")
  }

  @GetMapping(Array("/customer_page"))
  @ApiOperation("分页查询")
  @ApiImplicitParams(Array(
    new ApiImplicitParam(name = "page",value = "页数",required = true,dataType = "int",paramType = "query"),
    new ApiImplicitParam(name = "size",value = "条数",required = true,dataType = "int",paramType = "query"),
  ))
  def pageCustomer(page:Integer,size:Integer): ResponseEntity[PageResult[java.util.List[Customer]]]={
    ResponseEntity.ok(customerService.pageCustomer(PageRequest.of(page, size)))
  }


  @NotEmpty
  @PutMapping(Array("/customer"))
  @ApiOperation("更新用户")
  @ApiImplicitParams(Array(
    new ApiImplicitParam(name = "id",value = "用户ID",required = true,dataType = "int",paramType = "query"),
    new ApiImplicitParam(name = "name",value = "用户名",required = true,dataType = "String",paramType = "query")
  ))
  def updateCustomer(id:Integer,name:String): ResponseEntity[String] = {
    customerService.updateCustomer(id, name)
    ResponseEntity.ok("修改成功")
  }

  @DeleteMapping(Array("/customer/{id}"))
  @ApiOperation("删除用户")
  def deleteCustomer(id:Integer): ResponseEntity[String] = {
    customerService.deleteCustomer(id)
    ResponseEntity.ok("删除成功")
  }
}

这样我们一个简单的Scala版本的Web项目就写好啦,只需要启动就可以试着运行啦,本文的源代码地址:scala-demo,有任何不清楚的可以在评论区回复哈

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
34 1
|
7天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
32 8
只需四步,轻松开发三维模型Web应用
|
15天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
17天前
|
前端开发 JavaScript 持续交付
Web应用开发的方法
Web应用开发的方法
13 1
|
17天前
|
前端开发 JavaScript 持续交付
web应用开发
web应用开发
23 1
|
19天前
|
Web App开发 数据采集 iOS开发
「Python+Dash快速web应用开发」
这是「Python+Dash快速web应用开发」系列教程的第十六期,本期将介绍如何在Dash应用中实现多页面路由功能。通过使用`Location()`组件监听URL变化,并结合回调函数动态渲染不同页面内容,使应用更加模块化和易用。教程包括基础用法、页面重定向及无缝跳转等技巧,并通过实例演示如何构建个人博客网站。
24 2
WK
|
16天前
|
数据采集 API 开发者
很少有人用python开发web???
Python 是一种流行且广泛使用的编程语言,尤其在 Web 开发领域。它凭借简洁的语法、丰富的框架(如 Django 和 Flask)、强大的库支持及活跃的社区,成为许多开发者和企业的首选。Python 的易学性、高效性及广泛的应用场景(包括 Web API、微服务和数据分析等)使其在 Web 开发中占据重要地位,并将持续发挥更大作用。
WK
36 0
|
19天前
|
数据库 开发者 Java
数据战争:Hibernate的乐观与悲观锁之争,谁将主宰并发控制的王座?
【8月更文挑战第31天】在软件开发中,数据一致性至关重要,尤其是在多用户并发访问环境下。Hibernate 作为 Java 社区常用的 ORM 框架,提供了乐观锁和悲观锁机制来处理并发问题。乐观锁假设数据不易冲突,通过版本号字段 (`@Version`) 实现;悲观锁则假定数据易冲突,在读取时即加锁。选择哪种锁取决于具体场景:乐观锁适合读多写少的情况,减少锁开销;悲观锁适合写操作频繁的场景,避免数据冲突。正确应用这些机制可提升应用程序的健壮性和效率。
26 0
|
19天前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
29 0
|
19天前
|
前端开发 开发者 安全
JSF面向对象设计,让你轻松应对复杂业务需求,Web应用开发不再难!
【8月更文挑战第31天】在现代Web应用开发中,JSF(JavaServer Faces)框架凭借其强大的面向对象编程能力广泛应用于数据绑定和事件处理。数据绑定机制使前端与后端模型解耦,提高代码维护性和类型安全性;事件处理机制则增强了应用灵活性并进一步降低耦合度。本文通过示例代码展示了JSF的这些特性及其优势,帮助开发者更好地利用JSF构建高效、灵活的Web应用。然而,JSF也存在组件库较小和学习成本较高的局限,需根据具体需求权衡使用。
27 0