目录
一、相关版本
二、Maven因引入相关依赖
三、SpringBoot配置文件
四、代码生成工具
五、实现用户服务模块案例
1、Controller
2、Service
3、Entity
4、Mapper
5、接口测试
工具 | 版本 |
Idea | 2022.3.2 |
Springboot | 2.7.12 |
Kotlin | 1.8.20 |
MyBatis | 3.5.3.1 |
MySQL | 8.0.28 |
JDK | 1.8 |
相关代码已分享到Gitee:
https://gitee.com/Vmetrio/kotlin-springboothttps://gitee.com/Vmetrio/kotlin-springboot项目结构:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.12
com.example
springboot
0.0.1-SNAPSHOT
springboot
springboot
1.8
1.8.20
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib-jdk8
org.springframework.boot
spring-boot-starter-test
test
com.mysql
mysql-connector-j
com.baomidou
mybatis-plus-boot-starter
3.5.3.1
com.baomidou
mybatis-plus-annotation
3.5.3.1
com.baomidou
mybatis-plus-extension
3.5.3.1
com.baomidou
mybatis-plus-generator
3.5.3.1
org.apache.velocity
velocity-engine-core
2.3
${project.basedir}/src/main/kotlin
${project.basedir}/src/test/kotlin
org.springframework.boot
spring-boot-maven-plugin
org.jetbrains.kotlin
kotlin-maven-plugin
-Xjsr305=strict
spring
org.jetbrains.kotlin
kotlin-maven-allopen
${kotlin.version}
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB:demo}?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PWD:123456789}
driverClassName: com.mysql.cj.jdbc.Driver
## Hikari 连接池配置
hikari:
## 最小空闲连接数量
minimum-idle: 10
## 空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 18000
## 连接池最大连接数,默认是10
maximum-pool-size: 1000
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
## 连接池母子
pool-name: DatebookHikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
## 数据库连接超时时间,默认30秒,即30000
connection-timeout: 300000
connection-test-query: SELECT 1
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Shanghai
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml,classpath*:mapping/*.xml
#MyBatis 别名包扫描路径,通过该属性可以给包中的类注册别名,多个路径用逗号分割
type-aliases-package: com.example.springboot.entity
global-config:
db-config:
id-type: AUTO # 全局默认主键策略,默认为雪花ID,若表中设置了自增,则生成的实体自动添加自增ID属性,参考 TestDelete
logic-delete-field: deleted # 全局逻辑删除的实体字段名,若不配置,则不启用
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
configuration:
map-underscore-to-camel-case: true # 驼峰转下划线(默认)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 日志输出
package com.example.springboot
import com.baomidou.mybatisplus.generator.AutoGenerator
import com.baomidou.mybatisplus.generator.config.DataSourceConfig
import com.baomidou.mybatisplus.generator.config.GlobalConfig
import com.baomidou.mybatisplus.generator.config.PackageConfig
import com.baomidou.mybatisplus.generator.config.StrategyConfig
/**
* 代码生成
*/
fun main() {
AutoGenerator(
// 设置数据源
/**
* url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
* username: 用户名
* password: 密码
*/
DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True",
"root",
"123456789"
).build()
).run {
// 全局配置
global(
GlobalConfig.Builder()
// 启用 Kotlin
.enableKotlin()
/**
* 输出路径
* System.getProperty("user.dir") 得到的是这个项目的目录
* /src/main/kotlin 是你代码的存放目录,如果你是多模块项目,记得加上你的模块名
* 比如 service-oa-parent
* |- service-oa
* |- model
* 你想在 service-oa 中生成,那么应该填入: System.getProperty("user.dir") + "/service-oa/src/main/kotlin"
*/
.outputDir(System.getProperty("user.dir") + "/src/main/kotlin")
// 作者
.author("meng")
// 设置生成完毕后是否展开你 idea 的目录,不影响结果
.disableOpenDir()
.build()
)
// 包信息配置
packageInfo(
PackageConfig.Builder()
/**
* 假定下列代码的目录结构为:
* com.goxiaogle.auth
* |- controller
* |- service
* |- impl
* |- mapper
* 则 com.goxiaogle 为父包,auth 为模块名
*/
// 设置父包
.parent("com.example")
// 设置模块名
.moduleName("springboot")
// 以下四个可以去掉,如果你的分包命名和他一样
// 设置 Controller 层包名,默认就是 controller
.controller("controller")
// 设置 Service 层包名,默认就是 service
.service("service")
// 设置 Mapper 层包名,默认就是 mapper
.mapper("mapper")
// 设置 Entity 包名,默认就是 entity
.entity("entity")
.build()
)
// 策略配置
strategy(
StrategyConfig.Builder()
// 设置要生成代码的数据库表名,可以设置多个,如 addInclude(a, b, c)
.addInclude("user")
// 设置生成的 service 接口命名方式,默认是 IXxxService,这里改成 XxxService
// serviceBuilder() 方法建议在 build 后使用,此处偷懒直接用了
.serviceBuilder().formatServiceFileName("%sService")
.mapperBuilder().enableFileOverride().enableBaseColumnList().enableBaseResultMap()
.build()
// 设置其它几层的内容
// .entityBuilder()
// .controllerBuilder()
// .mapperBuilder().build()
)
// 执行
execute()
}
}
package com.example.springboot.controller;
import com.example.springboot.entity.UserEntity
import com.example.springboot.service.UserService
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController
import javax.annotation.Resource
import javax.servlet.http.HttpServletRequest
/**
*
* 用户服务
*
*
* @author meng
* @since 2024-02-03
*/
@RestController
@RequestMapping("/user")
class UserController {
// 需要注意和java不同的是,如果有bean的注入,需要在前面加上lateinit
@Resource
lateinit var userService: UserService;
@PostMapping("/getUserById")
fun getUserById(req: HttpServletRequest): UserEntity {
val id: String = req.getParameter("id")
val info: UserEntity = userService.findUserById(id)
return info
}
}
package com.example.springboot.service;
import com.example.springboot.entity.UserEntity;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
* 服务类
*
*
* @author meng
* @since 2024-02-03
*/
interface UserService : IService {
fun findUserById(userId: String): UserEntity
}
package com.example.springboot.service.impl;
import com.example.springboot.entity.UserEntity;
import com.example.springboot.mapper.UserMapper;
import com.example.springboot.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource
/**
*
* 服务实现类
*
*
* @author meng
* @since 2024-02-03
*/
@Service
open class UserServiceImpl : ServiceImpl(), UserService {
@Resource
lateinit var userMapper: UserMapper
override fun findUserById(userId: String): UserEntity {
return userMapper.findUserById(userId)
}
}
package com.example.springboot.entity;
import java.io.Serializable;
/**
*
*
*
*
* @author meng
* @since 2024-02-03
*/
class UserEntity : Serializable {
var id: String? = null
var name: String? = null
override fun toString(): String {
return "User{" +
"id=" + id +
", name=" + name +
"}"
}
}
package com.example.springboot.mapper;
import com.example.springboot.entity.UserEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper
/**
*
* Mapper 接口
*
*
* @author meng
* @since 2024-02-03
*/
@Mapper
interface UserMapper : BaseMapper {
//根据id获取用户信息
fun findUserById(id: String): UserEntity
}
xml:
id, name