首先感谢James的指点。
本次jfinal版本:3.4。
jfinal的model已经很酸爽,club里面带的model自动生成工具更是急速酸爽,它会自动扫描数据库,根据table和简单配置,自动生成base model(如BaseUser,继承自jfinal Model类,兼具model和bean功能)和最终model(如User,继承自生成的base model,可扩展自己的代码)。
因为对于model的扩展都写在最终model中,许多model扩展时会有一些共通代码,每个model都要写,这显然不能接受。有必要在jfinal Model类和自动生成的base model之间扩展出一个BaseModel类,把共通功能写到BaseModel中。
分享一:jfinal官网关键字搜索技巧
重要的话:不要重复造轮子!不要重复 踩坑!不要重复写代码!
所以先要学会在jfinal官网找答案,包括分享、反馈、还有大神的私信。
但是jfinal官网目前没有搜索框,咋办。自然是用其它搜索引擎,比如某度。因为club里面已经做了seo搜索引擎优化。
1、搜索“jfinal model扩展”→发现一个反馈
反馈的题目:jfinal bean属性扩展
时间: 2017-04-08 18:23
反馈的网址:http://www.jfinal.com/feedback/1195
结果:发现了baseModelTemplate的妙用。
2、搜索“jfinal baseModelTemplate”→发现一个分享
分享的题目:修改代码生成器,baseModel中自动生成表名静态常量(原理:使用BaseModelTemplate模板)
时间:2018-06-06 17:38
分享的网址:http://www.jfinal.com/share/933
结果:踩了一个小坑。然后问了下James就成功了。
坑,恰恰就是分享里面的这个图片里面的红色方框的部分,待会儿再细说。
分享二、_generator扩展步骤
1、先写个BaseModel,继承自jfinal的Model类。直接上代码。
我把它放在model/base包下。
2、从Jfinal的src中找到jfianl核心模板base_model_template.jf
它位于:/com/jfinal/plugin/activerecord/generator/base_model_template.jf
Ver3.4的它长这样子(是修改后的样子):
package #(baseModelPackageName); import YOURPACKAGE.commen.mode.base.BaseModel; import com.jfinal.plugin.activerecord.IBean; /** * Generated by JFinal, do not modify this file. */ #if (generateChainSetter) @SuppressWarnings({"serial", "unchecked"}) #else @SuppressWarnings("serial") #end public abstract class #(tableMeta.baseModelName)<M extends #(tableMeta.baseModelName)<M>> extends BaseModel<M> implements IBean { public static final String tableName = "#(tableMeta.name)"; #set(b = generateChainSetter) #for(cm : tableMeta.columnMetas) #set(argName = javaKeyword.contains(cm.attrName) ? '_' + cm.attrName : cm.attrName) public #(b ? 'M' : 'void') set#(firstCharToUpperCase(cm.attrName))(#(cm.javaType) #(argName)) { set("#(cm.name)", #(argName)); #if (b) return (M)this; #end } #set(getterOfModel = getterTypeMap.get(cm.javaType)) #if (isBlank(getterOfModel)) #set(getterOfModel = 'get') #end public #(cm.javaType) get#(firstCharToUpperCase(cm.attrName))() { return #(getterOfModel)("#(cm.name)"); } #end }
修改的地方,第3、14、16行:
①重点、最主要,只要修改一个地方,就是extends Model<M> 改成extends BaseModel<M> 即可。
import YOURPACKAGE.commen.mode.base.BaseModel;
public abstract class #(tableMeta.baseModelName)<M extends #(tableMeta.baseModelName)<M>> extends BaseModel<M> implements IBean {
②顺便把阿坤 2018-06-06 17:38的分享中的tableName全局常量抓过来留给Model用。
public static final String tableName = "#(tableMeta.name)";
记住,这个tableName,调用的时候,只要用类名直接调用即可,不能用实例。
3、把上面这个jf文件放到resources目录。这就是我踩了半天的小坑,因为参考的分享一直忘了看target,James提醒要看现场。maven编译的时候不会自动复制classes里面的其它文件。
4、修改_generator代码,留意最中间那一句,照着改就行。
设置自定义模板的代码位于gen声明和设置方言之间。
5、运行_generator。完成!
6、Service中调用测试方法:
以上完成。因为直接复制代码会丢失,直接粘贴了图片。
有问题欢迎互动。
点赞收藏一波