前段时间,趁着没任务,自己研究了代码生成的技术。发现没多少资料,或者有些关于jet的资料都很少,功能主体算开发大半,暂时可以自动生成管理列表的前后台代码。这篇文章主要还是写设计的一些思路,希望可以一起探讨下。

1.新建模块

2.查询设计器

这个主要是为多表生成sql使用。原来是单表,后期觉得单表功能还是太简单,无法显示代码表。

支持1:1、1:n、n:1、1:1:n、1:n:n

操作:选择主表(默认放在第一个列),下拉菜单选择。table用的是TableViewer,基于对象,很方便。

强烈推荐用swt designer这个插件,进行布局。不然这个会很费时间。 当然前提还是你要对布局相关 编码熟悉,出现问题,好进行解决。

一般表比较多,所以我设置了下拉显示数为50。

字段为表级联选择结果。

逻辑关系:1.关联查看 2.字典表 3.关联保存,选择后,方便后续具体生成后台处理代码。

多表:1:1:1

3.页面配置

页面的配置,核心就是字段的配置,这个可以极大减轻重复开发。想想页面有十几个字段,复制都要手麻了。。。字段不小心就写错。

通用功能一般是curd,我直接用tab设置编辑列。左侧是所有表字段名称,右侧是选择结果,可以通过上下按钮进行顺序调整。

显示名称:默认直接是数据库的comments。其他列主要是编辑使用,暂时未写模板,后续如果继续开发,可能进行调整。

管理查询配置需要查询的列,方便前台布局、后台sql生成。管理查询、编辑、查看页面都一致,直接共用统一的布局界面。只要声明不同的tableViewer即可。

4.参数配置

配置全局、跳转参数。

模块Id默认会直接取查询设计器的第一个表名的最后单词。模块名称其实就是页面的title。controllerKey是跳转到具体controller对应的path。由于我这个写的是jfinal框架的模板,有兴趣可以自己搜索学习。

5.预览

预览后才能生成,生成基于预览的text内容,所以如果有问题,可以在预览上直接修改。

预览的核心是使用jet模板,通过前面传入的配置参数,进行结果生成。比较难写的是controller类的模板,又写个了help类,来协助生成。因为controller类中,要考虑多表间的逻辑关系,有些关联保存要进行级联保存,代码表要list all到全台,举例说明吧:

一个采购单有一个附属信息表,一个采购单有多个采购物品,采购单包含字典表:采购类型。

edit前的对象查询结果返回到前台:

n:1:1

采购物品:采购单:采购类型:采购附属信息

Order order = Order.dao.findById(getPara());
setAttr("order ", order);
Pur  pur = Pur.dao.findById
(Order.dao. findByColumn (“purId”, order.getStr("purId"))));
setAttr("pur ",pur) ;
PurExtra purExtra = PurExtra.dao.findById(pur.getStr("ids"))
setAttr("purExtra ", purExtra);
1:1:n+n字典表

采购单:采购类型:采购附属信息: 采购物品

Order order = Order.dao.findById(getPara());
setAttr("order ", order);
Pur  pur = Pur.dao.findById
(Order.dao. findByColumn (“purId”, order.getStr("purId"))));
setAttr("pur ",pur) ;
PurExtra purExtra = PurExtra.dao.findById(pur.getStr("ids"))
setAttr("purExtra ", purExtra);
1:n:n

采购单:采购类型:采购附属信息: 采购物品

Pur  pur = Pur.dao.findById(getPara());
setAttr("pur ", pur);
PurExtra purExtra = PurExtra.dao.findById(pur.getStr("ids"));
setAttr("purExtra ", purExtra);
OrderService.service.list(splitPage);
setAttr("order ", order);
Type type = Type.dao.findAll();
setAttr("type ", type);

这些结果,通过PlatSqlGenTempHelper 进行协助生成,直接在jet写,几乎不太可能,比较复杂,而且jet毕竟不是java类文件,没有直接编辑java类文件方便的多。

贴下代码,是不是简便多了 :)

<%@ jet package="com.sam.plat.codegen.template" imports="com.sam.plat.codegen.template.helper.PlatSqlGenTempHelper com.sam.base.utils.CommonUtil java.util.* com.sam.base.db.meta.* com.sam.plat.codegen.meta.* com.sam.base.plugin.helper.* com.sam.plat.codegen.config.ModuleConfig" class="JfinalControllerJavaTemplate"  startTag="<$" endTag="$>" %>
<$ ModuleConfig module = (ModuleConfig) argument;$>
<$ String tableName = module.getTableMeta().getName().toLowerCase();$>
<$ String modelName = module.getModuleId();$>
<$ String controllerKey = module.getControllerKey();$>
<$ String indexUrl = module.getIndexUrl();$>
<$ String saveUrl = module.getSaveUrl();$>
<$ String editUrl = module.getEditUrl();$>
<$ String updateUrl = module.getUpdateUrl();$>
<$ String viewUrl = module.getViewUrl();$>
<$ String deleteUrl = module.getDeleteUrl();$>
<$ String packageName = module.getPackageName()+"."+PluginSetting.MODULE_CONTROLLER;$>
<$ String modelImport = module.getPackageName()+"."+PluginSetting.MODULE_MODEL+"."+modelName;$>
<$ String serviceImport = module.getPackageName()+"."+PluginSetting.MODULE_SERVICE+"."+modelName+"Service";$>
<$ PlatSqlGenTempHelper helper = new PlatSqlGenTempHelper(module.getMultiTableMetaList());$>
<$ String editViewController =helper.getEditViewController();$>
<$ String saveController =helper.getSaveController();$>
<$ String updateController =helper.getUpdateController();$>
<$ String deleteController =helper.getDeleteController();$>
package <$=packageName$>;import java.util.List;import little.ant.platform.annotation.Controller;
import little.ant.platform.controller.BaseController;
import little.ant.platform.model.Group;import org.apache.log4j.Logger;import <$=modelImport$>;
import <$=serviceImport$>;
/*** * @author sam xie* controllerKey*/
@SuppressWarnings("unused")
@Controller(controllerKey = "<$=controllerKey$>")
public class <$=modelName$>Controller extends BaseController {private static Logger log = Logger.getLogger(<$=modelName$>Controller.class);private String moduleIds;public void index() {
<$=modelName$>Service.service.list(splitPage);
render("<$=indexUrl$>");
}public void save() {
<$=saveController$>
redirect("<$=saveUrl$>");
}public void edit() {
<$=editViewController$>
render("<$=editUrl$>");
}public void update() {
<$=updateController$>
redirect("<$=updateUrl$>");
}public void view() {
<$=editViewController$>
render("<$=viewUrl$>");
}public void delete() {
<$=deleteController$>
redirect("<$=deleteUrl$>");
}}

6.遇到的问题:

1.由于才初步接触eclipse plugin开发,一些出现的问题,我用额外方法进行处理了,譬如查询设计器,点击不同的column列,所有级联字段对象,会全变成点击列的字段对象。我通过左右表字段重新赋值解决,虽然只是很小的性能开销,但是还是不舒服。希望有懂的人指教下。

multiTable.addSelectionChangedListener(new ISelectionChangedListener() {@Override
public void selectionChanged(SelectionChangedEvent arg0) {
// TODO Auto-generated method stub
TableItem[] items = multiTable.getTable().getSelection();
if(items.length==0) return;
MultiTableMeta multiTableMeta = (MultiTableMeta)items[0].getData();
leftCellEditor.setInput(MetaManager.getColumns(getConnection(),
multiTableMeta.getLeftTable().getName(),true));
rightCellEditor.setInput(MetaManager.getColumns(getConnection(),
multiTableMeta.getRightTable().getName(),true));
}
});

2.jMerger进行源码合并出现问题,需要codegen-2.2.3jar包才能正常合并,但是找的列子编译运行正常,整合到工程报错,暂时还没解决,可能需要重新下个eclipse试试。

3.JETEmitter整合,有点问题。

下一步:

1.所有配置的信息,每次生成后,都要生成对象进行保存。方便下次直接选择对象修改,反复生成。

2.编辑页面的模板编写,还没开始。

3.整合问题解决。方便每个工程下都有/tempates目录,自己修改jet,而不用改plugin源码,反复更新。

4.自定义参数,除通用外,增加自定义参数。

5.支持android代码自动生成。

现在开发医疗apk,想架设新的android框架,暂时不考虑再投入插件开发了。等后期android工作告一段落,继续完成。

最后贴下,完成的管理页面,顺序、查询修改时,直接修改配置信息,生成即可

代码生成器-设计心得相关推荐

  1. FPGA设计心得(4)Aurora IP core 的定制详情记录

    文章目录 写在前面 IP核定制页面预览 IP核定制详解 lane width Line Rate GT REFCLK (MHz) INIT clk (MHz) DRP clk (MHz) Datafl ...

  2. 创新课程管理系统数据库设计心得

    因为创新课程管理系统这一个项目,是一个从无到有,没有标准可以去参考的一个项目. 这个项目专门针对该课程进行设计,所以需求的功能点很多,因此数据库有多次设计,更改再推翻重新设计再更改. 因为用户有多个类 ...

  3. c语言编程课程心得,c语言编程课程设计心得.docx

    C语言编程课程设计心得 C语言编程课程设计心得 河南城建学院 <C语言程序设计>课程设计报告 适用专业工程管理专业课程名称C语言程序设计指导教师赵军民.魏新红.张芳芳 设计人:051409 ...

  4. 对c语言课程的心得体会,C语言课程设计心得体会

    C语言课程设计心得体会 回想这三周C语言课程设计的过程,真是痛并快乐着. 从领到书的那一刻,我就很郁闷?<C语言程序设计>到底事学什么的,到底有什么用.刚开始上课时?还在迷茫这门课程是用来 ...

  5. c语言程序设计课程设计心得体会,C语言程序课程设计心得体会

    在科技高度发展的今天,计算机在人们之中的作用越来越突出,学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要. 在这个星期里,我们专业的学生在专业老师的带领下进行了c ...

  6. php网页设计设计心得体会,网页设计心得体会范文

    范文参考网最近发表了一篇名为<网页设计心得体会范文>的范文,好的范文应该跟大家分享,重新编辑了一下发到范文参考网. 一.网站规划 本工作室主要用来做个人网站,主题是介绍自我,让更多的朋友认 ...

  7. 计算机vb实验感想,vb课程设计心得体会范文(精选3篇)

    vb课程设计心得体会范文(精选3篇) 当我们受到启发,对学习和工作生活有了新的看法时,就十分有必须要写一篇心得体会,这样可以不断更新自己的想法.那么你知道心得体会如何写吗?下面是小编为大家收集的vb课 ...

  8. 2016计算机课程设计,2016年ps课程设计心得体会范文

    课程设计的过程中涉及到很多方面的课程要素,最主要的课程要素包括课程目标.课程内容.学生的学习活动以及课程评价等.下面是小编整理的ps课程设计心得体会,欢迎借鉴! [1]ps课程设计心得体会 设计目的 ...

  9. 化工原理计算机辅助设计,化工原理课程设计心得体会

    化工原理课程设计心得体会 相信每一个学生经过了化工原理的课程设计之后都会有许多的感悟心得.下面是小编整理收集的化工原理课程设计心得体会范本,欢迎阅读参考! 篇一:化工原理课程设计心得 本次化工原理课程 ...

最新文章

  1. 《Node.js开发指南》书评汇总
  2. mySQL优化 my.ini 配置说明
  3. Linux下mysql主从配置
  4. 软件工程详细设计说明书_软件工程导论知识点梳理之简答题
  5. android 安卓 pc 电脑 通讯,安卓利用Socket和PC通信无法连接?
  6. 用户领域 API 监控和代码注入检测
  7. 《构建之法》1、2、3章读后感
  8. 类名作为形式参数传递
  9. poi导入到mysql_POI解析Excel导入数据到mysql
  10. hive不在同一台机 hue_【Impala篇】---Hue从初始到安装应用
  11. unity引用类型序列化_Unity中的序列化与反序列化
  12. ue4 unreal 使用 Download Image 下载图片 下载多张图片 批量下载 类似untiy协程
  13. html中的文字透明背景图片,利用css实现背景透明和文字不透明效果汇总
  14. 2018蓝桥模拟赛 天上的星星
  15. SQL 查询某个字段某个字符串内容出现次数实现
  16. 智加科技完成A+轮融资,推动物流产业升级
  17. SqlSugar 6.导航查询
  18. 纪念一位大师中的大师
  19. USACO 2.1.4 健康的荷斯坦奶牛 Healthy Holsteins
  20. DataGrip下载安装及使用教程(详细版)

热门文章

  1. FHQ大战Splay
  2. 【JPA】记录JPA批量处理的优化
  3. bat脚本实现遍历文件夹下所有jar文件名
  4. D-HARRY2020春夏新品
  5. ST_Geometry 的关系函数
  6. Java|Java中int的取值范围是多少
  7. 快速搭建静态网站生成器
  8. [转载]interp1
  9. 如何发好外贸邮件,看亚马逊SES邮件服务商怎么说?
  10. 普通文本el-tootip超出宽度自动显示省略号,悬停显示