前言
时间: 23/10/15
开发语言: Kotlin springboot 版本: 3.1.4 开发工具:IDEA 2023.2.1 (Ultimate Edition) jdk17
按照正常思路来讲,我们写springboot后端一般都是使用 maven + java 来完成的,但是由于最近一直在用Kotlin写 Android,所以我就尝试了一下使用 Gradle-kotlin + Kotlin 来完成这次的服务端代码编写。
写这篇文章的是为了解决前一篇 Android MVVM demo 的网络请求的链接问题
构建springboot项目
在 IDEA 中新建项目,选择 Spring Initalizr,Server URL:start.springboot.io
项目名称和路径自定义,语言选择 Kotlin,Type选择 Gradle - Kotlin。点击Next,来到依赖添加页面。
本项目还是用到了 Mybatis-plus,所以需要勾选。还有一个就是 SQL 连接中的 MySQL Driver。
点击 Create 就建立好了一个新的springboot项目。
结构说明
项目结构图
-
build.gradle.kts
同 Android 项目,这个是添加 springboot 依赖的文件,如果在创建项目时,少添加了依赖,可以在这个文件进行添加
-
application.properties
同 maven-java 结构一样,这是配置 springboot 的文件,包括 服务端口、数据库连接、mybatis配置等。
-
mapper
这是 mybatis 所需要的 Mapper.xml 存放的位置,文件相对路径在 application.properties 中定义。
创建 User 包以及相关内容
在 Application 类(即启动类)同级文件夹中创建一个包名为 user 的包。给它添加 controller、entity、mapper和service四个包。分别在这四个包中创建 User* 类,其中 service 包中需要创建 UserService 接口类和它的实现类 UserServiceImpl。
-
entity 类
class User { var id = 0 var username: String? = null var password: String? = null var userStatus = 0 }
-
controller 类
package com.may.library.user.controller import com.may.library.base.ApiResult import com.may.library.user.entity.User import com.may.library.user.service.UserService import jakarta.annotation.Resource import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.ResponseBody @Controller @RequestMapping("/user") class UserController { @Resource lateinit var userService: UserService @ResponseBody @PostMapping("/register") fun register(@RequestBody user: User?): ApiResult? { return userService.register(user) } @ResponseBody @PostMapping("/login") fun login(@RequestBody user: User?): ApiResult? { return userService.login(user) } }
给这个类添加 @Controller 和 @RequestMapping("/user") 注解,@Controller 注解能让 springboot 识别到这是个 Controller 类,而 @RequestMapping 则是定义的一级 url,("/user") 表示一级 url 为
/user
UserService 全局变量 添加了 @Resource 注解,这个注解就是依赖注入。
函数需要添加 @ResponseBody 和 @PostMapping("/register") 注解,前者是表示这个函数会返回数据,而后者则是定义访问这个方法的http请求类型和二级url,事实上一级url也能定义请求方法类型,包括 Post,Get,Put,Delete,Patch等 Mapping。而这些请求类型区别请自行百度,其中 @RequestMapping 表示所有类型都能接受。
-
mapper
interface UserMapper { fun register(user: User?): Int fun login(user: User?): User? fun findUserByUsername(username: String?): User? fun reduceUserStatus(id: Int, newStatus: Int): Int }
同controller,Mapper类也需要添加注解来使 springboot 识别,可以像在 controller 类一样添加
@Mapper
注解在类中,也可以添加 mybatis 库中的@MapperScan("com.may.library.*.mapper")
注解到 启动类 中。@SpringBootApplication @MapperScan("com.may.library.*.mapper")//对应包名,它会自动扫描所有同级包中的mapper包 public class LibraryApplication { public static void main(String[] args) { SpringApplication.run(LibraryApplication.class, args); } }
-
service
//接口类
@Service
interface UserService {fun register(user: User?): ApiResult
fun login(user: User?): ApiResult
fun alterName(id: Int, newName: String?): ApiResult
fun alterPassword(id: Int, newPass: String?): ApiResult
fun delete(id: Int): ApiResult
}
//实现类
@Service
class UserServiceImpl : UserService {
@Resource
lateinit var userMapper: UserMapperoverride fun register(user: User?): ApiResult {
if (user != null && !user.username.isNullOrEmpty() && !user.password.isNullOrEmpty()) {
val exists: User? = findUserByUsername(user.username!!)
if (exists != null) {
return ApiHandler.fail(403, "该用户名已存在!")
}
user.userStatus = 5
val uid: Int = userMapper.register(user)
if (uid < 1) {
println("user = [${user}]")
return ApiHandler.failServerError()
}
return ApiHandler.success(user)
}
return ApiHandler.fail(403, "数据异常!")
}override fun login(user: User?): ApiResult {
if (user != null) {
val tempUser = findUserByUsername(user.username!!)
if (tempUser != null) {
println(tempUser)
if (tempUser.userStatus