• 5.4 Generator与JavaBean
    • 1、生成器的使用
    • 2、相关生成文件
    • 3、Model与Bean合体后主要优势
    • 4、Model与Bean合体后注意事项
    • 5、常见问题解决

    5.4 Generator与JavaBean

    1、生成器的使用

    ActiveRecord 模块的 com.jfinal.plugin.activerecord.generator 包下,提供了一个 Generator 工具类,可自动生成 Model、BaseModel、MappingKit、DataDictionary 四类文件。

    生成后的 Model 与 java bean 合体,立即拥有了 getter、setter 方法,使之遵守传统的 java bean 规范,立即拥有了传统 JavaBean 所有的优势,开发过程中不再需要记忆字段名。

    使用生成器通常只需配置Generator的四个参数即可,以下是具体使用示例:

    1. // base model 所使用的包名
    2. String baseModelPkg = "model.base";
    3. // base model 文件保存路径
    4. String baseModelDir = PathKit.getWebRootPath() + "/../src/model/base";
    5.  
    6. // model 所使用的包名
    7. String modelPkg = "model";
    8. // model 文件保存路径
    9. String modelDir = baseModelDir + "/..";
    10.  
    11. Generator gernerator = new Generator(dataSource, baseModelPkg, baseModelDir, modelPkg, modelDir);
    12. // 在 getter、setter 方法上生成字段备注内容
    13. gernerator.setGenerateRemarks(true);
    14. gernerator.generate();

    baseModelPackageName、baseModelOutputDir、modelPackageName、modelOutputDir。四个参数分别表示 base model 的包名,baseModel的输出路径,model 的包名,model 的输出路径。

    可在官网下载jfinal-demo项目,其中的生成器可直接用于项目:http://www.jfinal.com

    2、相关生成文件

    BaseModel是用于被最终的Model继承的基类,所有的getter、setter方法都将生成在此文件内,这样就保障了最终Model的清爽与干净,BaseModel不需要人工维护,在数据库有任何变化时重新生成一次即可。

    MappingKit用于生成table到Model的映射关系,并且会生成主键/复合主键的配置,也即无需在configPlugin(Plugins me)方法中书写任何样板式的映射代码。

    DataDictionary是指生成的数据字典,会生成数据表所有字段的名称、类型、长度、备注、是否主键等信息。

    3、Model与Bean合体后主要优势

    • 充分利用海量的针对于Bean设计的第三方工具,例如jackson、freemarker

    • 快速响应数据库表变动,极速重构,提升开发效率,提升代码质量

    • 拥有IDE代码提示不用记忆数据表字段名,消除记忆负担,避免手写字段名出现手误

    • BaseModel设计令Model中依然保持清爽,在表结构变化时极速重构关联代码

    • 自动化table至Model映射

    • 自动化主键、复合主键名称识别与映射

    • MappingKit承载映射代码,JFinalConfig保持干净清爽

    • 有利于分布式场景和无数据源时使用Model

    • 新设计避免了以往自动扫描映射设计的若干缺点:引入新概念(如注解)增加学习成本、性能低、jar包扫描可靠性与安全性低

    4、Model与Bean合体后注意事项

    • 合体后JSP模板输出Bean中的数据将依赖其getter方法,输出的变量名即为getter方法去掉”get”前缀字符后剩下的字符首字母变小写,如果希望JSP仍然使用之前的输出方式,可以在系统启动时调用一下ModelRecordElResolver. setResolveBeanAsModel(true);

    • Controller之中的getModel()需要表单域名称对应于数据表字段名,而getBean()则依赖于setter方法,表单域名对应于setter方法去掉”set”前缀字符后剩下的字符串字母变小写。

    • 许多类似于jackson、fastjson的第三方工具依赖于Bean的getter方法进行操作,所以只有合体后才可以使用jackson、fastjson

    • JFinalJson将Model转换为json数据时,json的keyName是原始的数据表字段名,而jackson、fastjson这类依赖于getter方法转化成的json的keyName是数据表字段名转换而成的驼峰命名

    • 建议mysql数据表的字段名直接使用驼峰命名,这样可以令json的keyName完全一致,也可以使JSP在页面中取值时使用完全一致的属性名。注意:mysql数据表的名称仍然使用下划线命名方式并使用小写字母,方便在linux与windows系统之间移植。

    • 总之,合体后的Bean在使用时要清楚使用的是其BaseModel中的getter、setter方法还是其Model中的get(String attrName)方法

    5、常见问题解决

    • Sql Server数据库在使用生成器之时,会获取到系统自带的表,需要对这些表进行过滤,具体办法参考:http://www.jfinal.com/share/211