如题,做了一个小插件。原因了,是因为西安疫情防控,我被居家了,在家也得干活不是。。。但是家里这个二路网是真不咋滴。。。然后客服电信让升级或换机,客服说让我本人去营业厅办理。。。我说小区铁门被焊死了。。。她说那不行必须得线下办理。。。话完,还问我要好评。。。算了,,不吐槽了,还得想其他办法啊。。。
在公司网快,没啥感觉。。。但是家里这个网不好的情况下,,,加载确实不得劲。。。
然后记得网上有大神分享过启动加速的功能,但是他用的是模板代码生成,我这个又是老项目,并不想让我的Model折腾,最好是无感的那种。。。
嗯,还是自己撸一个吧,贴码!
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.jfinal.kit.JsonKit; import com.jfinal.kit.PathKit; import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.*; import com.jfinal.template.Engine; import com.jfinal.template.source.FileSource; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 优先从项目中的临时缓存文件中加载对应关系, * 没有缓存文件时,自动从数据库中加载关系,并生成临时缓存文件,供下次加载。 * 注意JSON解析工具使用了fastjson。 * @author 杜福忠 */ public class FastTableBuilder extends TableBuilder { private static final Log log = Log.getLog(FastTableBuilder.class); private final String name = "FastTableBuilder.json"; public void build(List<Table> tableList, Config config) { //从缓存中获取 if(new File(getFileName()).isFile()){ buildStrJson(tableList, config); return; } //从数据库中加载对应关系 buildDb(tableList, config); } private String getFileName() { return PathKit.getRootClassPath() + File.separator + name; } private void buildDb(List<Table> tableList, Config config) { super.build(tableList, config); Map<String, Map<String, String>> columnType = new HashMap<>(tableList.size()); for (Table table : tableList) { Map<String, Class<?>> a = table.getColumnTypeMap(); Map<String, String> b = new HashMap<>(a.size()); columnType.put(table.getName(), b); a.forEach((s, aClass) -> b.put(s, aClass.getName())); } String fileName = getFileName(); String strJson = JsonKit.toJson(columnType); Engine.use().getTemplateByString(strJson, false).render(null, fileName); log.info("文件生成:" + fileName); } private void buildStrJson(List<Table> tableList, Config config) { String strJson = new FileSource(PathKit.getRootClassPath(), name).getContent().toString(); JSONObject tab = JSON.parseObject(strJson, JSONObject.class); TableMapping tableMapping = TableMapping.me(); for (Table table : tableList) { table.setColumnTypeMap(config.getContainerFactory().getAttrsMap()); if (table.getPrimaryKey() == null) { CPI.setTablePrimaryKey(table, config.getDialect().getDefaultPrimaryKey()); } JSONObject columnType = tab.getJSONObject(table.getName()); columnType.forEach((columnLabel, obj) -> { Class<?> clazz = javaType.getType(obj.toString()); if (clazz != null) { table.setColumnType(columnLabel, clazz); } }); tableMapping.putTable(table); CPI.addModelToConfigMapping(table.getModelClass(), config); } } }
其中,json文件生成,代码偷懒使用了Engine的文件写入代码,追加极致的人可以改进。
OK,使用:
// 配置 ActiveRecordPlugin ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); arp.setTableBuilder(new FastTableBuilder());
json表关系映射文件生成的位置是class生成位置,所以项目clean的时候,也会一起更新。
不想使用它时,只需要注释掉 arp.setTableBuilder 或者通过配置文件if去控制是否使用这个工具。
好了,分享到这里结束。希望大家都平平安安的渡过疫情!
福利图就不放了,点个赞呗~ 试试吧