阅读完需:约 4 分钟
mybatis-plus 2.1.5 发布,新增 kotlin 代码生成
[v2.1.5] 2017.11.11
- 通用枚举 spring boot 兼容调整
- PostgreSQL 支持关键词非关键词转换问题
- Cat73 PR 稍微调整下自动生成的代码
- 支持 kotlin 代码生成
- bugfix for metaObj handler set val which not included in …
- alibaba 规范调整
- 其他
能自动生成代码就很舒服。
关键:
Mybatis-plus关键点:
代码示例:
GeneratorFactory.kt
package com.example.kotlin01
import com.baomidou.mybatisplus.annotation.DbType
import com.baomidou.mybatisplus.annotation.IdType
import com.baomidou.mybatisplus.core.toolkit.StringPool
import com.baomidou.mybatisplus.generator.AutoGenerator
import com.baomidou.mybatisplus.generator.InjectionConfig
import com.baomidou.mybatisplus.generator.config.*
import com.baomidou.mybatisplus.generator.config.po.TableInfo
import com.baomidou.mybatisplus.generator.config.rules.DateType
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine
import java.util.*
/**
* @Author: xjh
* @param null
* @return null
* @Description:
* @Date: 11:46 2020/11/10
* @version 1.0
*/
fun main(args: Array<String>) {
generator()
}
fun generator(){
println("begin generating")
val projectPath = System.getProperty("user.dir")
var mpg = AutoGenerator()
var globalConfig = GlobalConfig()
globalConfig.isKotlin = true
globalConfig.author = "xjh"
globalConfig.isOpen = false
globalConfig.outputDir = System.getProperty("user.dir") + "/src/main/kotlin"
globalConfig.isFileOverride = true
globalConfig.idType = IdType.AUTO
globalConfig.xmlName = "%sMapper"
globalConfig.mapperName = "%sMapper"
globalConfig.serviceName="%sService"
globalConfig.serviceImplName = "%sServiceImpl"
globalConfig.controllerName = "%sController"
globalConfig.isBaseColumnList = true
globalConfig.isBaseResultMap = true
globalConfig.dateType= DateType.ONLY_DATE
mpg.globalConfig = globalConfig
var dsc = DataSourceConfig()
dsc.dbType = DbType.POSTGRE_SQL
dsc.driverName = "org.postgresql.Driver"
dsc.url = "jdbc:postgresql://10.4.2.6:15432/smartpark?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"
dsc.username = "liantu"
dsc.password = "liantu123456"
dsc.schemaName = "vehicle"
mpg.dataSource = dsc
// 包配置
var pc = PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.parent="com.example.kotlin01.kotlinns"
mpg.packageInfo=pc
// 自定义配置
val cfg: InjectionConfig = object : InjectionConfig() {
override fun initMap() {
// to do nothing
}
}
val focList: MutableList<FileOutConfig> = ArrayList()
focList.add(object : FileOutConfig("/templates/mapper.xml.ftl") {
override fun outputFile(tableInfo: TableInfo): String? {
// 自定义输入文件名称
return (projectPath.toString() + "/src/main/resources/mapper/"
+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML)
}
})
// config xml template and outpath
cfg.fileOutConfigList = focList
mpg.cfg = cfg
val tc = TemplateConfig()
tc.entityKt="/templates/entity.kt"
tc.mapper="/templates/mapper.java"
mpg.template=tc
var strategy=StrategyConfig()
strategy.naming= NamingStrategy.underline_to_camel
strategy.columnNaming=NamingStrategy.underline_to_camel
strategy.isRestControllerStyle=true
strategy.isControllerMappingHyphenStyle=true
var sum=StringBuffer()
sum.append(pc.moduleName).append("_")
strategy.setTablePrefix(sum.toString())
mpg.strategy = strategy
mpg.templateEngine = FreemarkerTemplateEngine()
mpg.execute();
}
自定义模板
自定义模板可以找官方的来修改!
entity.kt.ftl
package ${package.Entity}
<#list table.importPackages as pkg>
import ${pkg}
</#list>
import com.baomidou.mybatisplus.annotation.*
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
/**
* <p>
* ${table.comment}
* </p>
*
* @author ${author}
* @since ${date}
*/
@TableName("${table.name}")
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
class ${entity} : ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
class ${entity} : Model<${entity}>() {
<#else>
class ${entity} : Serializable {
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
<#if field.keyFlag>
<#assign keyPropertyName="${field.propertyName}"/>
</#if>
<#if field.comment!?length gt 0>
<#if swagger2>
@ApiModelProperty(value = "${field.comment}")
<#else>
/**
* ${field.comment}
*/
</#if>
</#if>
<#if field.keyFlag>
<#-- 主键 -->
<#if field.keyIdentityFlag>
@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
<#elseif idType ??>
@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
<#elseif field.convert>
@TableId("${field.annotationColumnName}")
</#if>
<#-- 普通字段 -->
<#elseif field.fill??>
<#-- ----- 存在字段填充设置 ----->
<#if field.convert>
@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
<#else>
@TableField(fill = FieldFill.${field.fill})
</#if>
<#elseif field.convert>
@TableField("${field.annotationColumnName}")
</#if>
<#-- 乐观锁注解 -->
<#if (versionFieldName!"") == field.name>
@Version
</#if>
<#-- 逻辑删除注解 -->
<#if (logicDeleteFieldName!"") == field.name>
@TableLogic
</#if>
<#if field.propertyType == "Integer">
var ${field.propertyName}: Int? = null
<#else>
var ${field.propertyName}: ${field.propertyType}? = null
</#if>
</#list>
<#-- ---------- END 字段循环遍历 ---------->
<#if entityColumnConstant>
companion object {
<#list table.fields as field>
const val ${field.name?upper_case} : String = "${field.name}"
</#list>
}
</#if>
<#if activeRecord>
override fun pkVal(): Serializable? {
<#if keyPropertyName??>
return ${keyPropertyName}
<#else>
return null
</#if>
}
</#if>
override fun toString(): String {
return "${entity}{" +
<#list table.fields as field>
<#if field_index==0>
"${field.propertyName}=" + ${field.propertyName} +
<#else>
", ${field.propertyName}=" + ${field.propertyName} +
</#if>
</#list>
"}"
}
}
mapper.java.ftl
package ${package.Mapper};
import ${package.Entity}.${entity};
import ${superMapperClassPackage};
import org.apache.ibatis.annotations.Mapper
/**
* <p>
* ${table.comment!} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
@Mapper
<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
}
</#if>