扩展JFinal中的MetaBuilder

JFinal简介

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!

JFinal官网

解决思路

JFinal 在使用Generator自动生成JavaBean类的时候,提供了以下方法:

  • Generator.addExcludedTable(添加不需要生成的表)
  • Generator.setRemovedTableNamePrefixes(设置需要被移除的表名前缀)
  • MetaBuilder.isSkipTable(通过继承并覆盖此方法,跳过一些不希望处理的 table,定制更加灵活的 table 过滤规则)

但是并没有提供如果只想生成某些特定表的情况,还好JFinal提供了扩展方法

翻开Generator源码,看到以下代码片段:

1
2
3
4
5
6
7
8
/**
* 设置 MetaBuilder,便于扩展自定义 MetaBuilder
*/
public void setMetaBuilder(MetaBuilder metaBuilder) {
if (metaBuilder != null) {
this.metaBuilder = metaBuilder;
}
}

MetaBuilder是表结构构建的主类,而这个方法给我们提供了扩展MetaBuilder的可能。

翻开MetaBuilder源码,查看BuildTableNames方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
protected void buildTableNames(List<TableMeta> ret) throws SQLException {
ResultSet rs = getTablesResultSet();
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");

if (excludedTables.contains(tableName)) {
System.out.println("Skip table :" + tableName);
continue ;
}
if (isSkipTable(tableName)) {
System.out.println("Skip table :" + tableName);
continue ;
}

TableMeta tableMeta = new TableMeta();
tableMeta.name = tableName;
tableMeta.remarks = rs.getString("REMARKS");

tableMeta.modelName = buildModelName(tableName);
tableMeta.baseModelName = buildBaseModelName(tableMeta.modelName);
ret.add(tableMeta);
}
rs.close();
}

这个方法就是用来检测哪些表用于生成

开始扩展

  1. 新建扩展类MetaBuilderExtend,继承MetaBuilder
  2. 新建一个Set集合用于存放指定生成的表

    1
    protected Set<String> processedTables = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
  3. 在MetaBuilderExtend中重写方法buildTableNames,并添加以下新增代码行,用于过滤不需要生成的表

    1
    2
    3
    4
    if(!processedTables.contains(tableName)) {
    System.out.println("Skip table :" + tableName);
    continue ;
    }
  4. 修改Gernerator中的默认MetaBuilder为自定义的类MetaBuilderExtend

    1
    2
    MetaBuilderExtend metaBuilder = new MetaBuilderExtend(getDataSource());
    metaBuilder.addProcessedTable("table1","table2");// 添加需要生成的表

以上。重新运行_JFinalDemoGenerator.java即可只生成table1和table2两个表的Model实例.

源码下载

坚持原创技术分享,您的支持将鼓励我继续创作!