使用Kotlin + SpringBoot + JPA 進行web開發極簡教程

使用Kotlin + SpringBoot + JPA 進行web開發極簡教程

開始前須要有java基礎, SpringBoot基礎和kotlin基礎html

kotlin參考kotlin中文站的教程, 相信對於一個Java程序員來講, 半天就能上手了java

爲何選擇Kotlin

Kotlin比起java來講更加簡潔, 和java同樣是基於JVM的編程語言, 網上關於Kotlin優勢缺點的討論也有不少, 這裏就不展開了.mysql

固然, 最主要的緣由的是, 暑假實習的公司, 使用Kotlin和SpringBOot進行web開發的, o(╯□╰)ogit

以前對於kotlin的瞭解甚少, 只知道在去年的google I/O大會上成了安卓的第一語言, 其餘就不瞭解了.
如今趁暑假前, 先學習一下kotlin.程序員

教程開始

建立一個SpringBoot工程

首先固然是使用IDEA建立一個SpringBoot工程
github

這裏語言選擇Kotlin, 使用gradle進行管理, 以後再選擇模塊的時候只要選擇上web, jpa和mysql就能夠了web

而後修改配置文件, 由於導入了jpa, 因此必定要設置好DataSource, 不然沒法啓動spring

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: ABCabc123#
    url: jdbc:mysql://localhost:3306/db_test?useSSL=false

配置完成後能夠, 在source目錄下能夠看到已經建立好了一個Application.kt文件, 用於啓動SpringBoot, 對應Java下的Application.java
文件sql

@SpringBootApplication
class TestApplication

fun main(args: Array<String>) {
    runApplication<TestApplication>(*args)
}

建立Controller

@RestController
@RequestMapping("/hello")
class HelloController {
    @GetMapping
    fun hello():String {
        return "hello world"
    }
}

和java的寫法很是像, 能夠無縫轉換編程

啓動!

使用curl命令進行請求

➜  ~ curl "http://localhost:8080/hello"
hello world

簡單的請求完成了

使用Swagger2生成接口文檔

使用Swagger2能夠自動生成接口文檔和進行接口測試, 極大的方便了後端, 不須要去花很大的功夫獲去維護文檔

首先試試導入Swagger2

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.8.0'
    compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.8.0'

配置Swagger2

@Configuration
@EnableSwagger2
class Swagger2 {

    @Bean
    fun createRestApi(): Docket {
        return Docket(DocumentationType.SWAGGER_2)  // 使用Swagger2
                .apiInfo(apiInfo())                 // 設置接口頁面信息
                .select()                           // 返回ApiSelectorBuilder的實例
                .apis(RequestHandlerSelectors.basePackage("io.ride.vote.web"))      // api接口所在的包
                .paths(PathSelectors.any())         
                .build()
    }

    /**
     * 頁面信息展現
     */
    private fun apiInfo(): ApiInfo {
        return ApiInfoBuilder()
                .title("Vote RestFul APIs文檔")
                .description("項目API接口文檔")
                .contact(Contact("ride", "", "supreDong@gamil.com"))
                .version("0.0.1")
                .build()
    }
}

@Configuration註解代表這是一個配置類, @EnableSwagger2註解代表啓用Swagger2

經過在controller中添加註解來生成api文檔

@Api(value = "測試", description = "測試控制器")
@RestController
@RequestMapping("/hello")
class HelloController {

    @GetMapping
    @ApiOperation("你好!世界!", notes = "返回hello world")
    fun hello(): String {
        return "hello world"
    }
}

以後打開http://localhost:8080/swagger-ui.html能夠看到生成的接口信息
如圖, 在該頁面上還以對接口進行測試

統一異常處理

和java下的操做是一致的, 只是把java翻譯成了kotlin

@ControllerAdvice
class CustomExceptionHandler {

    @ExceptionHandler(ApiException::class)
    fun handlerApiException(e: ApiException): ResponseEntity<Result> {
        val result = Result(e.code, e.data)
        return result.ok()

    }

    @ExceptionHandler(MissingServletRequestParameterException::class)
    fun handMissingServletRequestParameterException(e: MissingServletRequestParameterException): ResponseEntity<Result> {

        val result = Result(HttpStatus.BAD_REQUEST.value(), e.message)
        return result.ok()
    }

}

class ApiException(val code: ResultCode, val data: HashMap<String, Any>? = null) : RuntimeException(code.msg)

使用JPA

首先配置JPA:

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    database: mysql

建立data類

@Entity
@Table(name = "t_user")
data class User(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long = -1,
        @Column(nullable = false)
        var username: String? = null,
        @Column(nullable = false)
        var password: String? = null,
        @Column(nullable = false)
        var email: String? = null,
        @Column(nullable = true)
        var nickname: String? = null,
        @Column(nullable = false)
        var createTime: Date = Date()
)

建立repository類

interface IUserService {
    /**
     * 添加一個用戶
     */
    fun addUser(user: User): User

    /**
     * 展現全部用戶
     */
    fun listAll(): List<User>

    /**
     * 刪除一個用戶
     */
    fun deleteUser(id: Long)

}

進行單元測試

@RunWith(SpringRunner::class)
@SpringBootTest
class UserRepositoryTest {

    @Autowired
    private lateinit var userRepository: UserRepository

    @Test
    fun `find all user test`() {
        println(userRepository.findAll())
    }

    @Test
    fun `add user test`() {
        val user = User(username = "ride", email = "supreDong@gmail.com", password = "123123", nickname = "ride")
        println(userRepository.save(user))
    }

    @Test
    fun `delete user test`() {
        val user = userRepository.findById(1)
        println(user.orElse(null))
        if (user.isPresent)
            userRepository.deleteById(user.get().id)
    }
}

在單元測試而且只能在單元測試中(kotlin1.2)可使用反引號來定義方法

總結

使用使用kotlin結合SpringBoot是一種從船新體驗, 推薦你們嘗試一下

項目地址

相關文章
相關標籤/搜索