1. 程式人生 > 其它 >kotlin+springboot+mybatis-puls+mysql搭建gradle-web工程

kotlin+springboot+mybatis-puls+mysql搭建gradle-web工程

kotlin+springboot+mybatis-puls+mysql搭建web工程

​ 前段時間研究了spring security及OAuth2系列之後,本來打算研究spring的,但是部門發生了一些情況,我轉崗到了另一個部門,具體做內部CICD的產品,需要用kotlin開發,於是我需要從零開始學習Kotlin語言。於是我連忙找了本Kotlin的書籍看了幾天主要的語法章節,想著需要做點demo讓自己熟悉一下,於是有了這篇文章。

​ 本片主要講怎麼基於kotlin搭建springboot-web專案。

在IDEA上建立gradle專案

​ 在IDEA上建立kotlin專案有多種方式,這裡我採用瞭如圖的方式

引入所需依賴

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'junit', name: 'junit', version: '4.12'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.4.4'
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.27'
    implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.4.3.3'

}

​ 這裡引入springboot\mysql-connector-java\mybatis-plus等元件,用的是基於groovy語言構建的gradle指令碼,不知道這麼指令碼怎麼來的,怎麼到https://mvnrepository.com/ maven倉庫查詢gradle對應的依賴指令碼。

新建各個檔案(dao\service\mapper\entity\controller)

新建啟動類

@SpringBootApplication
@MapperScan("com.canway.app.dao")
open class MainApplicationClass

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

新建entity(user表)

import com.fasterxml.jackson.annotation.JsonFormat
import java.util.Date

class TUser {
    var id: Int? = null;
    
    var username: String? = null;
    
    var age: Int? = null;
    
    var sex: Int? = null;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = JsonFormat.Shape.STRING)
    var createTime: Date? = null;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = JsonFormat.Shape.STRING)
    var updateTime: Date? = null;
}

新建service/impl

import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.canway.app.dto.PageQuery
import com.canway.app.entity.TUser

interface TUserService {
    
    fun queryById(id: Int): TUser?
    
    fun queryByPage(pageQuery: PageQuery): Page<TUser?>
    
    fun insert(tUser: TUser): TUser
    
    fun update(tUser: TUser): TUser
    
    fun deleteById(id: Int): Boolean
}
package com.canway.app.service.impl

import com.baomidou.mybatisplus.core.toolkit.Wrappers
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.canway.app.dao.TUserDao
import com.canway.app.dto.PageQuery
import com.canway.app.entity.TUser
import com.canway.app.service.TUserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

@Service
class TUserServiceImpl @Autowired constructor(private var tUserDao: TUserDao): TUserService{
    
    // 不同過在建構函式中注入屬性的話,可以通過尋常注入方式
//    @Resource
//    private lateinit var tUserDao: TUserDao;
    
    override fun queryById(id: Int): TUser? {
        return tUserDao.queryById(id)
    }
    
    override fun queryByPage(pageQuery: PageQuery): Page<TUser?> {
        val wrapper = Wrappers.lambdaQuery<TUser>()
//        wrapper.like(TUser::getUsername, query.getUsername());
        //        wrapper.like(TUser::getUsername, query.getUsername());
        val page: Page<TUser?> = Page<TUser?>(pageQuery.getPageNum(), pageQuery.getPageSize(), true)
        val page1: Page<TUser?> = tUserDao.selectPage(page, wrapper)
        return page1
    }
    
    override fun insert(tUser: TUser): TUser {
        this.tUserDao.insert(tUser);
        return tUser;
    }
    
    override fun update(tUser: TUser): TUser {
        this.tUserDao.update(tUser);
        return tUser;
    }
    
    override fun deleteById(id: Int): Boolean {
        return this.tUserDao.deleteById(id) > 0
    }
}

新建dao

package com.canway.app.dao

import com.baomidou.mybatisplus.core.mapper.BaseMapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.canway.app.entity.TUser
import org.apache.ibatis.annotations.Param

interface TUserDao: BaseMapper<TUser> {
    /**
     * 通過ID查詢單條資料
     *
     * @param id 主鍵
     * @return 例項物件
     */
    fun queryById(id: Int): TUser?
    
    /**
     * 查詢指定行資料
     *
     * @param tUser 查詢條件
     * @return 物件列表
     */
    fun queryByPage(page: Page<TUser?>?, @Param("tUser") tUser: TUser?): List<TUser?>?
    
    /**
     * 統計總行數
     *
     * @param tUser 查詢條件
     * @return 總行數
     */
    fun count(tUser: TUser?): Long
    
    /**
     * 新增資料
     *
     * @param tUser 例項物件
     * @return 影響行數
     */
    override fun insert(tUser: TUser?): Int
    
    /**
     * 批量新增資料(MyBatis原生foreach方法)
     *
     * @param entities List<TUser> 例項物件列表
     * @return 影響行數
    </TUser> */
    fun insertBatch(@Param("entities") entities: List<TUser?>?): Int
    
    /**
     * 批量新增或按主鍵更新資料(MyBatis原生foreach方法)
     *
     * @param entities List<TUser> 例項物件列表
     * @return 影響行數
     * @throws org.springframework.jdbc.BadSqlGrammarException 入參是空List的時候會拋SQL語句錯誤的異常,請自行校驗入參
    </TUser> */
    fun insertOrUpdateBatch(@Param("entities") entities: List<TUser?>?): Int
    
    /**
     * 修改資料
     *
     * @param tUser 例項物件
     * @return 影響行數
     */
    fun update(tUser: TUser?): Int
    
    /**
     * 通過主鍵刪除資料
     *
     * @param id 主鍵
     * @return 影響行數
     */
    fun deleteById(id: Int?): Int
}

新建controller

package com.canway.app.controller

import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.canway.app.dto.PageQuery
import com.canway.app.entity.TUser
import com.canway.app.service.TUserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("tUser")
class UserController {
    
    @Autowired
    private val tUserService: TUserService? = null
    

    @GetMapping("/hello")
    fun helloworld(): String {
        return "Hello world"
    }
    
    @GetMapping("{id}")
    fun queryById(@PathVariable("id") id: Int): ResponseEntity<TUser?> {
        return ResponseEntity.ok(this.tUserService?.queryById(id))
    }
    
    @PostMapping
    fun add(tUser: TUser): ResponseEntity<TUser> {
        return ResponseEntity.ok(this.tUserService?.insert(tUser));
    }
    
    @GetMapping
    fun queryByPage(query: PageQuery): ResponseEntity<Page<TUser?>> {
        return ResponseEntity.ok(this.tUserService?.queryByPage(query))
    }
    
    @PutMapping
    fun edit(tUser: TUser): ResponseEntity<TUser> {
        return ResponseEntity.ok(this.tUserService?.update(tUser))
    }
    
    @DeleteMapping
    fun deleteById(id: Int): ResponseEntity<Boolean> {
        return ResponseEntity.ok(this.tUserService?.deleteById(id))
    }
}

新建mybatis配置類

package com.canway.app.config

import com.baomidou.mybatisplus.annotation.DbType
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
open class MybatisPlusConfig {
    
    @Bean
    open fun mybatisPlusInterceptor(): MybatisPlusInterceptor{
        var interceptor = MybatisPlusInterceptor();
        //向Mybatis過濾器鏈中新增分頁攔截器
        interceptor.addInnerInterceptor(PaginationInnerInterceptor(DbType.MYSQL))
        interceptor.addInnerInterceptor(OptimisticLockerInnerInterceptor())
        //還可以新增i他的攔截器
        return interceptor
    }
}

新增配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/java_web?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: 123456
    hikari:
      minimum-idle: 1
      maximum-pool-size: 3
      connection-timeout: 5000

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

總結

​ 基於kotlin+springboot+mybatis-plus+mysql的gradle-web專案到這裡就結束,整個過程中還是讓自己熟悉了一些kotlin的具體語法,像函式宣告、變數、類的定義等,後續寫業務的時候才能相對快速熟悉其它語法。