最新消息:

扩展JFinal中的MetaBuilder

PHP laobailiaojishu 115浏览 0评论

var vote_init_script = document.getElementById(“vote_init_node”);if(!vote_init_script){var _vote_init_script = document.createElement(“script”);_vote_init_script.id=”vote_init_node”;_vote_init_script.src=”http://s2.pstatp.com/pgc/mp_vote_file.js?1491988380″;document.getElementsByTagName(“head”)[0].appendChild(_vote_init_script);}

扩展JFinal中的MetaBuilder

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

[JFinal官网](http://www.jfinal.com/)

问题由来

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

Generator.addExcludedTable(添加不需要生成的表)

Generator.setRemovedTableNamePrefixes(设置需要被移除的表名前缀)

MetaBuilder.isSkipTable(通过继承并覆盖此方法,跳过一些不希望处理的 table,定制更加灵活的 table 过滤规则)

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

解决思路

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

/**

* 设置 MetaBuilder,便于扩展自定义 MetaBuilder

*/

public void setMetaBuilder(MetaBuilder metaBuilder) {

if (metaBuilder != null) {

this.metaBuilder = metaBuilder;

}

}

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

翻开MetaBuilder源码,查看BuildTableNames方法

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集合用于存放指定生成的表

protected Set<String> processedTables = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);

3. 在MetaBuilderExtend中重写方法buildTableNames,并添加以下新增代码行,用于过滤不需要生成的表

if(!processedTables.contains(tableName)) {

System.out.println(“Skip table :” + tableName);

continue ;

}

4. 修改Gernerator中的默认MetaBuilder为自定义的类MetaBuilderExtend

MetaBuilderExtend metaBuilder = new MetaBuilderExtend(getDataSource());

metaBuilder.addProcessedTable(“table1″,”table2”);// 添加需要生成的表

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

源码:https://github.com/baininghan/jfinal-ext/tree/master/Extended-MetaBuilder

你的项目中使用到了JFinal (单选) 00%00% 不是 投票

转载请注明:PHP学习 » 扩展JFinal中的MetaBuilder

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址