水个贴,用jfinal的generator生成kotlin版本的model类

最近研究用kotlin来写jfinal。

虽然kotlin可以直接调用java代码,但是java代码和kotlin代码混在一起,总感觉别扭,所以写一个模板生成kotlin版的model类。貌似没有什么实际用途,全当水帖了。

代码生成器的配置,kotlin版。

fun main(args: Array<String>) {
    // base model 所使用的包名
    val baseModelPackageName = "com.admin.entity"
    // base model 文件保存路径
    val baseModelOutputDir = System.getProperty("user.dir") + "\\src\\main\\java\\" + baseModelPackageName.replace('.', '\\')

    println("输出路径:$baseModelOutputDir")

    //获取数据库连接
    var dp= DruidPlugin("jdbc:mysql://localhost/admin","root","root")
    dp.start()

    // 创建生成器
    val gen = Generator(dp.dataSource, baseModelPackageName, baseModelOutputDir)

    // 设置数据库方言
    gen.setDialect(MysqlDialect())

    //设置生成的mappingkit
    var mappingKitGenerator= MappingKitGenerator(baseModelPackageName,baseModelOutputDir)
    gen.setMappingKitGenerator(mappingKitGenerator)

    //设置模板引擎
    gen.setBaseModelTemplate("/base_model_template.jf")
    gen.setMappingKitTemplate("/mapping_kit_template.jf")

    // 在 getter、setter 方法上生成字段备注内容
    gen.setGenerateRemarks(true)

    // 开始生成代码
    FileKit.removeDir(File(baseModelOutputDir))
    gen.generate()
    FileKit.rename(baseModelOutputDir)
}

generator生成的文件扩展名是.java,要改成.kt,没找到什么好方法更改,直接写一个工具类重命名。

class FileKit {
    companion object{
        @JvmStatic
        fun getFiles(path: String): List<String> {
            var files: ArrayList<String> = ArrayList()
            var file = File(path)
            var dir = file.listFiles()
            for (i in dir.indices) {
                if (dir[i].isFile) {
                    files.add(dir[i].toString())
                }
            }
            return files
        }
        @JvmStatic
        fun rename(path: String) {
            var files = getFiles(path)
            for (file in files) {
                var oldFile = File(file)
                var oldFileName = file.split("\\")[file.split("\\").size - 1]

                var newFileName = oldFileName.replace(".java", ".kt")
                if (newFileName.substring(0,4) == "Base"){
                    newFileName = newFileName.substring(4, newFileName.length)
                }

                var newFile = File(path + "\\" + newFileName)
                oldFile.renameTo(newFile)
            }
        }
        
        @JvmStatic
        fun removeDir(dir: File) {
            
            var files = dir.listFiles()
            for (file in files) {
                if (file.isDirectory) {
                    removeDir(file)
                } else {
                    file.delete()
                }
            }
            dir.delete()
        }
    }
}

然后是模板引擎base_model_template.jf和mapping_kit_template.jf(放在resources)目录下就可以了。

package #(baseModelPackageName)

import com.jfinal.plugin.activerecord.Model
import com.jfinal.plugin.activerecord.IBean

class #(tableMeta.modelName) : Model<#(tableMeta.modelName)>(){
#for(cm : tableMeta.columnMetas)
	### 添加注释
	#(cm.remarks??)
	### 改成驼峰式命名
	#set(argName = javaKeyword.contains(cm.attrName) ? '_' + cm.attrName : cm.attrName)
	#set(getterOfModel = getterTypeMap.get(cm.javaType))
	var #(argName) : 
	### 换成kotlin下的变量生命方式
        #if(cm.javaType=="java.lang.Integer")
		Int
		#else if(cm.javaType=="java.lang.String")
		String
		#else if(cm.javaType=="java.lang.Boolean")
		Boolean
		#else if(cm.javaType=="java.lang.Long")
		Long
		#else if(cm.javaType=="java.lang.Double")
		Double
		#else if(cm.javaType=="java.lang.Float")
		Float
		#else if(cm.javaType=="java.lang.Short")
		Short
		#else if(cm.javaType=="java.lang.Byte")
		Byte
		#else
		#(cm.javaType)
		#end
		
		get() = #(getterOfModel)("#(cm.name)")
        set(#(argName)) {
            set("#(cm.name)", #(argName))
        }
#end
}
package #(mappingKitPackageName)

import com.jfinal.plugin.activerecord.ActiveRecordPlugin

class #(mappingKitClassName) {
   companion object{
   #for (tableMeta : tableMetas)
        fun mapping(arp : ActiveRecordPlugin){
            arp.addMapping("#(tableMeta.name)", "#(tableMeta.primaryKey)", #(tableMeta.modelName)::class.java)
        }
    #end
    }
}

最后生成的结果就是这样的

class User : Model<User>(){
      var id : Int
        get() = getInt("id")
        set(id) {
            set("id", id)
        }
      var name : String
        get() = getStr("name")
        set(name) {
            set("name", name)
        }
      var password : String
        get() = getStr("password")
        set(password) {
            set("password", password)
        }
}


class _MappingKit {
   companion object{
        fun mapping(arp : ActiveRecordPlugin){
            arp.addMapping("user", "id", User::class.java)
        }
    }
}


评论区

JFinal

2022-02-20 12:15

能在 kotlin 下玩 enjoy 生成,相当不错,好玩,点赞

fmpoffice

2022-02-22 21:04

支持

zzutligang

2022-02-24 11:30

支持

热门分享

扫码入社