JFinal实践笔记——只生成少数表的Model

JFinal在Generator中提供了办法可排除不需要生成的表名的方法

// 添加不需要生成的表名
generator.addExcludedTable("adv");

但数据库下有上百张表,我只需要生成其中的一两个表的Model,可以定制一个MetaBuilder,覆盖isSkipTable方法

public class _MetaBuilder extends MetaBuilder {
    public _MetaBuilder(DataSource dataSource) {
        super(dataSource);
    }
    
    @Override
    protected boolean isSkipTable(String tableName) {
        return !tableName.startsWith("T_CUSTOM_");
    }
}

在Generator中设置该定制的MetaBuilder即可,datasource来自druidPlugin.getDataSource()

Generator gen = new Generator(datasource, baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
gen.setMetaBuilder(new _MetaBuilder(datasource));


评论区

JFinal

2017-08-24 10:51

这个实现超级简洁,而且足够表达这类需求的场景,感觉你的分享

北流家园网

2017-08-27 09:32

还是有问题,如果只生成部分表,_MappingKit 中,就会删除原来的配置,重新生成这部分表的配置,那么,原来的映射就没有了。如何解决这个问题?

不惑

2017-08-27 12:29

JFinal默认的逻辑是把不需要Table对应的Model减掉,这里的逻辑是只加上需要的,两者都是要生成所有应用所需的Model。

JFinal

2017-08-27 14:23

@北流家园网 没有问题, _MappingKit 中生成的映射同时也被改变过来,符合生成的 Model

北流家园网

2017-08-28 16:36

@JFinal 有问题。比如有两个表A、B,开始时是全部生成Model,_MappingKit 就全有AB两表的映射。现在要重新生成B表或者增加一个C表,只生成BC表的Model,_MappingKit会重新生成,只有B或者C表的映射,A表不见了。

JFinal

2017-08-28 16:46

@北流家园网 A表不见了,这正是楼主希望的,因为他就想生成指定的 B 与 C

JJfinal

2017-08-31 17:47

我这跑完也没生成

小蜗牛

2017-09-20 10:56

@JFinal 波大,我按这个修改,报其他不生成的表缺少主键

JFinal

2017-09-20 11:11

@小蜗牛 jfinal 的 model 使用的是 active record 模式,这个模式的基本出发点就是:一个 model 对象唯一对应表中的一条记录,而对应关系统使用的是主键。

因此,主键必不可少,否则 active record 模式就无法正常运转

小蜗牛

2017-09-20 11:13

@JFinal 波大,我明白了!谢谢波大

JFinal

2017-09-20 11:24

@小蜗牛 只有采用了主键让 model 对象与表记录关联起来,才可以用 model.update()、 model.delete() 这类不带参的方法来操作数据

否则,形式必然是这样的:xxx.update(idValue)

liugz

2021-01-20 16:19

@JFinal 碰到类似需求,有上千张表,只需生成几张表的model。 可以考虑jfinal中加入这个功能

JFinal

2021-01-21 01:01

@liugz 其实是支持的, MetaBuilder 中提供了一个 skip 方法,可以这样:
MetaBuilder builder = new MetaBuilder(...);
builder.skip( t -> {
return ! tableNameHashSet.contains(t) ;
});

Generator gen = new Generator(...);
gen.setMetaBuilder(builder);
gen.generate();

skip 方法支持你传入一个函数,返回 true 表示跳过不当前 table 不处理,随心所欲定制

JFinal

2021-01-21 01:02

注意上面代码中的 tableNameHashSet 中存放的是需要处理的 tableName 集合,只有在这个集合的才会被处理

你可以事先 new HashSet(),然后将你需要处理的 tableName 先放进去,这样就实现了你希望的功能了

热门分享

扫码入社