最近研究用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) } } }