谈一下代码生成

    前阵子搞个小项目,虽然很简单,全都是增删改查,但是数据表还是非常之多的。
于是就郁闷了。 要求半个月交活, 项目组里人全被调走了,也没个帮手, 自己年后清闲惯了,一下眼见这么多体力劳动真的很想放弃。。。这时哪怕有个实习生兄弟在身边都成了救世主。

    硬着头皮做了两个模块发现这个项目业务太简单了, 而且开发起来是有规律的, 包结构和名称规范好,有了表名完全可以按照某种约定来生成代码。

    于是百度了一下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
}


java代码
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);




这个只是个demo
时间有限而且没怎么研究velocity ,代码很多都是网上现成的, 扫一下就行了, 不建议多看。。

猜你喜欢

转载自zouruixin.iteye.com/blog/1509035
今日推荐