jfinal扩展之Model功能扩展+model生成器_generator扩展分享

首先感谢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就成功了。

坑,恰恰就是分享里面的这个图片里面的红色方框的部分,待会儿再细说。

image.png

分享二、_generator扩展步骤

1、先写个BaseModel,继承自jfinal的Model类。直接上代码。

image.png

我把它放在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代码,留意最中间那一句,照着改就行。

image.png

设置自定义模板的代码位于gen声明和设置方言之间。

5、运行_generator。完成!

6、Service中调用测试方法:

image.png

以上完成。因为直接复制代码会丢失,直接粘贴了图片。

有问题欢迎互动。

评论区

JFinal

2018-07-19 17:52

这是目前对于扩展 Model 的最好分享了没有之一,感谢你的分享

点赞收藏一波

jiren

2018-07-21 07:55

点赞

flash866

2018-07-23 11:00

原来如此,明白了,今天把我的ModelX改成直接继承,可以少敲二十多个字符了,谢谢分享

郑亚峰

2018-10-17 19:27

原来如此 解决了 感谢

郑亚峰

2018-10-17 19:27

@JFinal 这个很详细很棒一下就解决了

himans

2018-10-22 11:08

@郑亚峰 多交流不客气哈~

冰心666

2019-10-13 20:09

冰心666

2019-10-13 20:09

public class BaseModel> extends Model {


public void testBaseModel()
{
System.out.println("testBaseModel");
}
}

himans

2020-03-26 17:07