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