SpringBoot-Kotlin

2021-08-09 17:41:05 浏览数 (1)

什么是Kotlin?

Kotlin(科特林)是一个用于现代多平台应用的静态编程语言 ,由 JetBrains 开发。

Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。除此之外Kotlin还可以编译成二进制代码直接运行在机器上(例如嵌入式设备或 iOS)。 [2]

Kotlin已正式成为Android官方支持开发语言。

文档

先来看一下Kotlin文档的地址

Kotlin中文文档:https://kotlinlang.org/

Kotlin英文文档:https://www.kotlincn.net/

语法

简单介绍几个不太一样的语法

属性

Kotlin类中的属性既可以用关键字 var 声明为可变的,也可以用关键字 val 声明为只读的。

变量

定义只读局部变量使用关键字 val 定义。只能为其赋值一次。

可重新赋值的变量使用 var 关键字

实现接口
代码语言:javascript复制
class Child : MyInterface {
    override fun bar() {
        // 方法体
    }
}
空值与null检测

当某个变量的值可以为null的时候,必须在声明处的类型后添加 ? 来标识该引用可为空。

代码语言:javascript复制
fun parseInt(str: String): Int? {}
When表达式

when 表达式取代了类 java 语言的 switch 语句。其最简单的形式如下:

代码语言:javascript复制
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块
        print("x is neither 1 nor 2")
    }
}

如果 when 作为一个表达式使用,则必须有 else分支

语法还是有很多细节上的不同,感兴趣的自己可以去官方的文档查看,英文功底差一点的,推荐中文文档,不吃力,翻译的也比较精准

SpringBoot整合Kotlin

作为java开发者来说优先肯定是SpringBoot整合kotlin,简单易用

先来看一下依赖,如果你对你的网络有足够的自信的话,可以不配置maven仓库,否则的话你会发现你需要等待一个世纪

代码语言:javascript复制
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.4.0"
    id("io.spring.dependency-management") version "1.0.10.RELEASE"
    kotlin("jvm") version "1.4.10"
    kotlin("plugin.spring") version "1.4.10"
}

group = "top.lzmvlog"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    maven {
        url = uri("https://maven.aliyun.com/repository/central")
    }
    maven {
        url = uri("https://maven.aliyun.com/repository/spring")
    }
    maven {
        url = uri("https://maven.aliyun.com/repository/gradle-plugin")
    }
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
    compileOnly("org.projectlombok:lombok")
    compileOnly("com.baomidou:mybatis-plus-boot-starter:3.1.0")
    runtimeOnly("mysql:mysql-connector-java")
    annotationProcessor("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("io.projectreactor:reactor-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

ymal配置

代码语言:javascript复制
server:
  port: 9090

spring:
  application:
    name: authority
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/myschool?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT+8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath:/mapper/*.mapper
  type-aliases-package: top.lzmvlog.demokotlin.model
  configuration:
    cache-enabled: true
    call-setters-on-nulls: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

首先按照编程惯例,先来个Hello World给大家打个招呼

代码语言:javascript复制
@RestController
class IndexController {

    @GetMapping("hello")
    fun hello(): String {
        return "Hello World"
    }
}

那下面就随便来个增删改查吧,老样子先看数据库,万年不变的学生表,主要是想偷懒

代码语言:javascript复制
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(225) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('0', '张三', 20);
INSERT INTO `student` VALUES ('1', '少杰', 20);
INSERT INTO `student` VALUES ('2', '赵云', 20);

MybatisPlus操作简单,就用这个为例操作就行

model

代码语言:javascript复制
data class Student(
        var id: Int,
        var name: String,
        var age: Int
)

data class创建一个一个包含 getterssettersequals()hashCode()toString() 以及 copy()POJO,直呼内行,Lombok都不用了

Kotlin的语法表示,如果类中没有逻辑可以省略括号

Mapper

代码语言:javascript复制
@Mapper
interface StudentMapper : BaseMapper<Student> {}

Service

代码语言:javascript复制
 interface StudentService {

    /**
     * 查询学生集合
     */
    fun selectList(): List<Student>

    /**
     * 保存学生信息
     */
    fun save(student: Student): Int

    /**
     * 根据学生id删除
     */
    fun delete(id: Int): Int

    /**
     * 更新学生信息
     */
    fun update(student: Student): Int

    /**
     * 分页查询学生信息
     */
    fun selectPage(page: Page<Student>): IPage<Student>

}

ServiceImpl

代码语言:javascript复制
@Service
class StudentServiceImpl : StudentService {

    @Autowired
    lateinit var studentMapper: StudentMapper

    /**
     * 查询所有学生
     */
    override fun selectList(): List<Student> {
        return studentMapper.selectList(Wrappers.query())
    }

    /**
     * 保存学生信息
     */
    override fun save(student: Student): Int {
        return studentMapper.insert(student)
    }

    /**
     * 根据学生id删除
     */
    override fun delete(id: Int): Int {
        return studentMapper.deleteById(id)
    }

    /**
     * 更新学生信息
     */
    override fun update(student: Student): Int {
        return studentMapper.updateById(student)
    }

    /**
     * 分页查询学生信息
     */
    override fun selectPage(page: Page<Student>): IPage<Student> {
        return studentMapper.selectPage(page, Wrappers.query())
    }
}

Controller

代码语言:javascript复制
@RestController
class StudentController {

    @Autowired
    lateinit var studentServiceImpl: StudentServiceImpl

    /**
     * 查询学生信息
     */
    @GetMapping("select")
    fun select(): List<Student> {
        return studentServiceImpl.selectList()
    }

    /**
     * 保存学生信息
     */
    @PostMapping("save")
    fun save(@RequestBody student: Student): String {
        val save = studentServiceImpl.save(student)
        if (save == 1) {
            return "保存成功"
        }
        return "保存失败"
    }

    /**
     * 根据学生id删除学生信息
     */
    @DeleteMapping("delete/{id}")
    fun delete(@PathVariable id: Int): String {
        val delete = studentServiceImpl.delete(id)
        if (delete == 1) {
            return "删除成功"
        }
        return "删除失败"
    }

    /**
     * 修改学生信息
     */
    @PostMapping("update")
    fun update(@RequestBody student: Student): String {
        val update = studentServiceImpl.update(student)
        if (update == 1) {
            return "修改成功"
        }
        return "修改失败"
    }

    /**
     * 修改学生信息
     */
    @PostMapping("selectPage")
    fun selectPage(page: Page<Student>): IPage<Student> {
        return studentServiceImpl.selectPage(page);
    }

}
代码语言:javascript复制
server:
  port: 9090

spring:
  application:
    name: authority
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/myschool?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT+8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath:/mapper/*.mapper
  type-aliases-package: top.lzmvlog.demokotlin.model
  configuration:
    cache-enabled: true
    call-setters-on-nulls: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

除了语法和Java有区别,别的都差不太多,没有什么特别的不一样的,唯一需要注意的是gradle在打包的时候,无法检测到SpringBoot的测试类,注释打包就会变得一切正常,暂时还不太明白是为什么,如果有解决方案,欢迎指教!

大家加油!距离2020年结束没多久了,奥里给!

0 人点赞