什么是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
的时候,必须在声明处的类型后添加 ?
来标识该引用可为空。
fun parseInt(str: String): Int? {}
When
表达式
when
表达式取代了类 java
语言的 switch
语句。其最简单的形式如下:
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
仓库,否则的话你会发现你需要等待一个世纪
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
给大家打个招呼
@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
创建一个一个包含 getters
、 setters
、 equals()
、 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年结束没多久了,奥里给!