谈一下代码生成
前阵子搞个小项目,虽然很简单,全都是增删改查,但是数据表还是非常之多的。
于是就郁闷了。 要求半个月交活, 项目组里人全被调走了,也没个帮手, 自己年后清闲惯了,一下眼见这么多体力劳动真的很想放弃。。。这时哪怕有个实习生兄弟在身边都成了救世主。
硬着头皮做了两个模块发现这个项目业务太简单了, 而且开发起来是有规律的, 包结构和名称规范好,有了表名完全可以按照某种约定来生成代码。
于是百度了一下velocity和freemaker, 还是觉得velocity简单,适合这个形势, 花了大概10分钟搭个helloworld就可以开发了, 10分钟上手确实不是velocity吹出来的。
然后定义规则, 我这里是dao daoimpl , service serviceimpl , model, action , list.jsp, view.jsp, update.jsp, delete.jsp ;有共性的基本上就这么一套了, 结构还是比较原始, 什么service dao之类的也都用上了, 为了多熟悉熟悉velocity多写几个模板来练手。
具体过程就是
1. 想好规范, 每个包名、类名、结构、属性名称、大小写等等。。 一时想不全开发时也能发现了。
2. 写velocity模板
3.生成文件
4.可以写个界面方便使用一下之类的
至于velocity如何生成代码, 举个例子
vm文件:
package com.xxx.model;/** * $className * @author xxx */public class $className {#foreach($key in $columns.keySet())#set($type = "String")#if($columns.get($key) == "DATE")#set($type = "java.util.Date")#elseif($columns.get($key) == "VARCHAR2") #set($type = "java.lang.String")#elseif($columns.get($key) == "NUMBER")#set($type = "java.lang.Integer")#end#set($s = $key.substring(0, 1).toUpperCase() + $key.substring(1)) private $type $key; public $type get$s() { return $key; } public void set$s($type $key) { this.$key=$key; }#end}
Map<String,String> columns = new HashMap<String,String>();//1接收表名String tableName = request.getParameter("tablename");//2将表字段信息存入缓存Class.forName("oracle.jdbc.driver.OracleDriver");Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@x.x.x.x:1521:xxx","xxx","xxx");DatabaseMetaData dmd = conn.getMetaData();String sql = "select * from user_tab_columns t where t.TABLE_NAME = '"+tableName+"'";Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);while(rs.next()){columns.put(rs.getString("COLUMN_NAME"), rs.getString("DATA_TYPE"));}StringWriter writer = new StringWriter();try {VelocityEngine ve = new VelocityEngine();Properties p = new Properties();p.setProperty(Velocity.INPUT_ENCODING, "UTF-8");p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");ve.init(p);Template t = ve.getTemplate("vm/action.vm");VelocityContext context = new VelocityContext();context.put("columns",columns);context.put("modelName", tableName);t.merge(context, writer);