现在的位置: 首页 > 综合 > 正文

代码生成工具的实现思路

2014年07月02日 ⁄ 综合 ⁄ 共 2425字 ⁄ 字号 评论关闭
1.利用 JDBC中的 ResultSetMetaData 和 DatabaseMetaData  来读取表字段的相关信息

DataSource dataSource = context.getBean("dataSource", DataSource.class);
		Connection conn = dataSource.getConnection();
		List<Column> lsColumns = new ArrayList<Column>(10);
		PreparedStatement stmt = conn.prepareStatement("select *  from "+tableName+" where 1=0 ");
		ResultSet resultSet = stmt.executeQuery();
		ResultSetMetaData rsmd = resultSet.getMetaData();
		int n = rsmd.getColumnCount();
		for (int i = 1; i <= n; i++)
		{
			String colName = rsmd.getColumnName(i);
			String fieldName = StringUtil.toBeanPatternStr(colName);
			Column column = new Column();
			column.setName(colName) ;
			column.setJavaName(fieldName) ;
			column.setDataType(rsmd.getColumnClassName(i));
			column.setPrecision(String.valueOf(rsmd.getPrecision(i)));
			column.setScale( String.valueOf(rsmd.getScale(i)) );
			column.setLength( String.valueOf(rsmd.getColumnDisplaySize(i)));
			column.setNullable(String.valueOf("1".equals(rsmd.isNullable(i))));

//获取列注释
			DatabaseMetaData dbmd = conn.getMetaData();
			ResultSet rs = dbmd.getColumns(null, null, tableName, null);
			while (rs.next()) {
				if (colName.equals(rs.getString("COLUMN_NAME")))
					column.setComments(rs.getString("REMARKS"));
			}
			//获取主键列
			ResultSet rs2 = dbmd.getPrimaryKeys(null, null, tableName);
			while (rs2.next()) {
				if (colName.equals(rs2.getString("COLUMN_NAME")))
					column.setColumnKey("TRUE");	
			}

2.讲表字段相关信息放入模板引擎的上下文中,根据模板内容生成JAVA文件;

	Velocity.addProperty("file.resource.loader.path", getClassPath()
				+ tmplDir);
		Template template = Velocity.getTemplate(tmplFile, encoding);
		VelocityContext tmplContext = new VelocityContext(context);
		FileUtil.createFile(absolutePath);
		PrintWriter writer = new PrintWriter(
				new FileOutputStream(absolutePath), true);
		template.merge(tmplContext, writer);
		writer.flush();
		writer.close();

3.tmplFile模板文件的内容如下:

 #if($pkResult.size()>1)
     @EmbeddedId
     #else
     @Id
     @Column(name = "$pkResult.get(0).name"  )
     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="${TABLE_NAME}_SEQ") 
     #end
     private ${keyType}  ${keyVar} ;

     #foreach($prop in $columnResult)
        #set ($fieldName  = ${prop.javaName} )
        #set ($fieldType  = $prop.dataType )
        @Column(name = "${prop.name}" )
    	private $fieldType $fieldName ;
	
     #end


     public  ${keyType} get${KeyFieldUpper} () {
		return ${keyVar};
     }

     public void set${KeyFieldUpper} (${keyType}  ${keyVar}) {
		this.${keyVar} = ${keyVar};         
      }

     #foreach($prop in $columnResult)
        #set ($fieldName  = ${prop.javaName} )
        #set ($fieldType  =  $prop.dataType )
        #set ($innerFieldUpper  = $stringUtil.capitalize($fieldName) )
	public $fieldType get$innerFieldUpper () {
		return $fieldName;
	}
	public void set$innerFieldUpper ($fieldType $fieldName) {
		this.$fieldName = $fieldName;		
	}
     #end

抱歉!评论已关闭.