定义好规则和配置格式,就可以开始动手写代码了,首先,需要两个class来保存表的信息和字段信息,还需要从表的xml文件中提取出表的信息,代码如下:
Field.java
package com.bang.dev.autocoder;
public class Field {
private String fieldLabel; //字段标签
private String fieldComment; //注释
private String fieldName; //字段名
private String fieldClassName; //转换以后的java类名
private String fieldType; //字段类型
private String fieldClassType; //转换以后的java类型
private int fieldLen; //字段长度
private int fieldNull; //字段空标志
private boolean readOnly; //只读标志
private String fieldFormType; //保留,表单类型
private String fieldSeq; //序列
private String defaultValue; //默认值
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public void setFieldType(String fieldType) {
this.fieldType = fieldType;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public void setFieldLen(int fieldLen) {
this.fieldLen = fieldLen;
}
public void setFieldNull(int fieldNull) {
this.fieldNull = fieldNull;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public int getFieldLen() {
return fieldLen;
}
public String getFieldName() {
return fieldName;
}
public String getFieldType() {
return fieldType;
}
public int getFieldNull() {
return fieldNull;
}
public boolean isReadOnly() {
return readOnly;
}
public String getFieldClassName() {
return fieldClassName;
}
public void setFieldClassName(String fieldClassName) {
this.fieldClassName = fieldClassName;
}
public String getFieldClassType() {
return fieldClassType;
}
public String getFieldLabel() {
return fieldLabel;
}
public String getFieldFormType() {
return fieldFormType;
}
public String getFieldSeq() {
return fieldSeq;
}
public void setFieldClassType(String fieldClassType) {
this.fieldClassType = fieldClassType;
}
public void setFieldLabel(String fieldLabel) {
this.fieldLabel = fieldLabel;
}
public void setFieldFormType(String fieldFormType) {
this.fieldFormType = fieldFormType;
}
public void setFieldSeq(String fieldSeq) {
this.fieldSeq = fieldSeq;
}
public String getFieldComment() {
return fieldComment;
}
public void setFieldComment(String fieldComment) {
this.fieldComment = fieldComment;
}
}
Table.java
package com.bang.dev.autocoder;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import com.infinitouch.xiaowei.autocode.Field;
public class Table {
private String tableName;
private String tableClassName;
private String tableShortName;
private ArrayList tableFields;
private ArrayList primaryKeys;
private String display;
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public ArrayList getPrimaryKeys() {
return primaryKeys;
}
public void setPrimaryKeys(ArrayList primaryKeys) {
this.primaryKeys = primaryKeys;
}
public String getTableClassName() {
return tableClassName;
}
public void setTableClassName(String tableClassName) {
this.tableClassName = tableClassName;
}
public ArrayList getTableFields() {
return tableFields;
}
public void setTableFields(ArrayList tableFields) {
this.tableFields = tableFields;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getTableShortName() {
return tableShortName;
}
public void setTableShortName(String tableShortName) {
this.tableShortName = tableShortName;
}
public static Table parse(String fileName)throws Exception
{
Table t = new Table();
ArrayList fieldList = new ArrayList();
HashMap fieldMap = new HashMap();
ArrayList pkList = new ArrayList();
SAXBuilder sb = new SAXBuilder(); //建立构造器
DataInputStream in = new DataInputStream(new FileInputStream(fileName));
Document doc = sb.build(in); //读入stream流
Element root = doc.getRootElement(); //获得根节点
Element fields = root.getChild("fields");
List list = fields.getChildren();
for(int i=0;i<list.size();i++)
{
Element e = (Element)list.get(i);
Field f = new Field();
f.setFieldClassName(e.getChild("class-name").getText());
f.setFieldName(e.getChild("name").getText());
f.setFieldClassType(e.getChild("class-type").getText());
f.setFieldFormType(e.getChild("form-type").getText());
f.setFieldLabel(e.getChild("label").getText());
f.setFieldLen(Integer.parseInt(e.getChild("length").getText()));
f.setFieldNull(Integer.parseInt(e.getChild("null").getText()));
f.setFieldType(e.getChild("type").getText());
f.setReadOnly(Boolean.getBoolean(e.getChild("readonly").getText()));
if(e.getChild("default") != null)
f.setDefaultValue(e.getChild("default").getText());
else
f.setDefaultValue("");
if(e.getChild("seq") != null)
f.setFieldSeq(e.getChild("seq").getText());
else
f.setFieldSeq("");
if(e.getChild("comment") != null)
f.setFieldComment(e.getChild("comment").getText());
else
f.setFieldComment(e.getChild("label").getText());//默认以label作为注释
fieldList.add(f);
fieldMap.put(f.getFieldName(),f);
}
Element pks = root.getChild("pks");
list = pks.getChildren();
for(int i=0;i<list.size();i++)
{
Element e = (Element)list.get(i);
String name = e.getChild("name").getText();
pkList.add(fieldMap.get(name));
}
Element name = root.getChild("name");
t.setTableName(name.getText());
Element class_name = root.getChild("class-name");
t.setTableClassName(class_name.getText());
Element short_name = root.getChild("short-name");
t.setTableShortName(short_name.getText());
Element display = root.getChild("display");
t.setDisplay(display.getText());
//设置主键
t.setPrimaryKeys(pkList);
//设置表字段
t.setTableFields(fieldList);
return t;
}
}
另外需要保存读取进来的配置文件的class,代码如下:
AutoCoderConfig.java
package com.bang.dev.autocoder;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.util.List;
import java.util.Vector;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class AutoCoderConfig {
private String saveToPath; //生成代码的保存路径
private String tableFileName; //读取表名的文件
private String dbDriver; //数据库驱动
private String dbUrl; //数据库URL
private String dbUsername; //数据库用户名
private String dbPassword; //数据库密码
private Vector tmpVector;
private Vector otherClass;
private boolean dbFlag;
public boolean isDbFlag() {
return dbFlag;
}
public void setDbFlag(boolean dbFlag) {
this.dbFlag = dbFlag;
}
public String getDbDriver() {
return dbDriver;
}
public void setDbDriver(String dbDriver) {
this.dbDriver = dbDriver;
}
public String getDbPassword() {
return dbPassword;
}
public void setDbPassword(String dbPassword) {
this.dbPassword = dbPassword;
}
public String getDbUrl() {
return dbUrl;
}
public void setDbUrl(String dbUrl) {
this.dbUrl = dbUrl;
}
public String getDbUsername() {
return dbUsername;
}
public void setDbUsername(String dbUsername) {
this.dbUsername = dbUsername;
}
public Vector getOtherClass() {
return otherClass;
}
public void setOtherClass(Vector otherClass) {
this.otherClass = otherClass;
}
public String getSaveToPath() {
return saveToPath;
}
public void setSaveToPath(String saveToPath) {
this.saveToPath = saveToPath;
}
public String getTableFileName() {
return tableFileName;
}
public void setTableFileName(String tableFileName) {
this.tableFileName = tableFileName;
}
public Vector getTmpVector() {
return tmpVector;
}
public void setTmpVector(Vector tmpVector) {
this.tmpVector = tmpVector;
}
public static AutoCoderConfig readConfig(String name) throws Exception {
AutoCoderConfig config = new AutoCoderConfig();
SAXBuilder sb = new SAXBuilder(); //建立构造器
DataInputStream in = new DataInputStream(new FileInputStream(
name));
Document doc = sb.build(in); //读入stream流
Element root = doc.getRootElement(); //获得根节点
Element file_path = root.getChild("file-path");
config.saveToPath = file_path.getText();
Element table_file = root.getChild("table-file");
config.tableFileName = table_file.getText();
//数据库配置
Element db_element = root.getChild(