_JFinalDemoGenerator.java中如何生成指定前缀的model

会炒饭的美工 发布于 2016/09/09 17:08
阅读 1K+
收藏 0
项目中的不同业务表是按不同的包进行分层的,每个业务一个包,包里面对应的放置model,请问怎么能方便的在对应包中生成相应的model和basemodel?
加载中
0
JFinal
JFinal

     jfinal 的 generator 模块中的各种 Generator 以及 MetaBuilder 都是面向扩展设计的。所以,只需要通过继承 ModelGenerator 并覆盖掉里面的 genPackage(...) 与 writeToFile(TableMeta) 这两个方法,可以随心所欲地改变 model 保存的路径

    扩展好自己的 ModelGenerator后,通过向 Generator 构造方法注入自己扩展的 ModelGenerator 即可。

    此外,jfinal 建议 model 与 base model 存放在统一的目录下,因为 model 在项目变大时会被其它项目所重用,此时需要将 model 部分抽取成 maven 的 module 来管理会非常之方便

0
会炒饭的美工
会炒饭的美工

@JFinal 老大,可能是我意思没说明白,我的意思是不同的业务里面需要的数据库的表是不一样的,在_JFinalDemoGenerator中有这样的设定,

// 添加不需要生成的表名

gernerator.addExcludedTable("t_sys_blog");

我的想法是不添加不生成的表,而是添加生成的表,例如以t_emp_开头人事相关信息表,以t_dept_开头的部门相关信息表,以t_salary_开头的其他业务相关的表,这样就可以按业务来生成相应的model

会炒饭的美工
会炒饭的美工
回复 @JFinal : 感谢指点,那只能自己来写了,呵呵!
JFinal
JFinal
利用这个方法,相当于可以随心所欲去控制要跳过/生成哪些表
JFinal
JFinal
这种需灵活控制生成表选择的问题,继承扩展一下 MetaBuilder,覆盖其中的 isSkipTable(String) 方法,返回true 的则被跳过,否则被生成
0
会炒饭的美工
会炒饭的美工

感谢@JFinal 老大的指点,我重写了MetaBuilder的buildTableNames方法,然后在main方法中注入了一下

//创建表生成器
MyMetaBuilder mmbuilder = new MyMetaBuilder(getDataSource());
//添加需要生成的表前缀
mmbuilder.setTablePrefix("t_sys");
//注入MetaBuilder对像
gernerator.setMetaBuilder(mmbuilder);

public class MyMetaBuilder extends MetaBuilder {
    public String tablePrefix;
    public MyMetaBuilder(DataSource dataSource) {
        super(dataSource);
    }
    
    public void setTablePrefix(String tablePrefix){
        this.tablePrefix = tablePrefix;
    }
    
    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 ;
            }
            if(!tableName.contains(tablePrefix)){
                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();
    }

}



0
JFinal
JFinal

引用来自“会炒饭的美工”的评论

感谢@JFinal 老大的指点,我重写了MetaBuilder的buildTableNames方法,然后在main方法中注入了一下

//创建表生成器
MyMetaBuilder mmbuilder = new MyMetaBuilder(getDataSource());
//添加需要生成的表前缀
mmbuilder.setTablePrefix("t_sys");
//注入MetaBuilder对像
gernerator.setMetaBuilder(mmbuilder);

public class MyMetaBuilder extends MetaBuilder {
    public String tablePrefix;
    public MyMetaBuilder(DataSource dataSource) {
        super(dataSource);
    }
    
    public void setTablePrefix(String tablePrefix){
        this.tablePrefix = tablePrefix;
    }
    
    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 ;
            }
            if(!tableName.contains(tablePrefix)){
                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();
    }

}



针对这个需求,最简单的代码如下:

public class MyMetaBuilder extends MetaBuilder {
  public String tablePrefix;

  public MyMetaBuilder(DataSource dataSource) {
    super(dataSource);
  }

  public void setTablePrefix(String tablePrefix){
    this.tablePrefix = tablePrefix;
  }

  protected boolean isSkipTable(String tableName) {
    return tableName.contains(tablePrefix);
  }
}
    利用 jfinal 为开发者提供的 MetaBuilder.isSkipTable(...) 这个回调方法,可以不必理会核心流程,从而也不会破坏核心流程代码,方便未来升级到更高版本的 jfinal。
会炒饭的美工
会炒饭的美工
赞!!
0
Z
Zempty

嘿嘿,刚刚也在思考这个问题。没想到早在11个月前就有人提问了。楼主是想要生成想要的,而不是不生成不想要的。覆写isSkipTable确实可以做到,不错......这样再封装一波,就可以通过传表前缀和路径,就可以把想到的魔导输出到想输的路径了...............再研究一下,应该可以达到随心所欲地想要,不想要。

返回顶部
顶部