`
CnXiaowei
  • 浏览: 49780 次
社区版块
存档分类
最新评论

自做代码生成器(三)动手写代码

阅读更多

    定义好规则和配置格式,就可以开始动手写代码了,首先,需要两个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(
分享到:
评论

相关推荐

    stm8代码生成器

    STM8代码生成器是专为STM8微控制器设计的一款工具,它简化了开发过程,帮助初学者快速构建和编写代码,无需从头开始手动编写底层驱动程序。 STM8代码生成器的主要功能包括: 1. **自动生成初始化代码**:此工具...

    自己动手写编译器链接器PDF及源码.rar

    《自己动手写编译器链接器》是一本深入解析编译器与链接器工作原理的教程,通过PDF文档和源码实例,为读者提供了一条亲手构建这些关键工具的实践之路。编译器和链接器是软件开发过程中的重要组成部分,它们在程序的...

    自己动手写编译器、链接器影印版及源代码

    《自己动手写编译器、链接器》是王俊博先生的一本经典著作,它深入浅出地介绍了编译器和链接器的工作原理,并提供了完整的源代码,让读者能够亲手实践编译器与链接器的构建过程。这本书是学习计算机系统底层知识的...

    编译方法实验-扫描器和中间代码生成器的实现

    在编译原理中,"编译方法实验-扫描器和中间代码生成器的实现"是一个重要的实践环节,它涵盖了编译器设计的核心组成部分。在这个实验中,学生将深入理解两次编译过程,并动手实现关键的编译器组件。 首先,我们来...

    自己动手写编译器链接器高清完整版

    根据提供的文件信息,本文将围绕“自己动手写编译器链接器”的主题展开,深入探讨编译器与链接器的基本概念、工作原理及其在实际编程中的应用。 ### 编译器的基本概念 编译器是一种计算机程序,它将一种编程语言...

    C#简单代码生成器(含源码注释和项目文件)

    **C#简单代码生成器** 是一款面向C#初学者的工具,旨在简化代码编写过程,提高开发效率。它利用程序自动化生成常见的代码结构,帮助开发者快速构建基础框架,从而有更多时间专注于业务逻辑和创新功能。这款工具包含...

    自己动手写编译器.zip

    《自己动手写编译器》是一本面向编程爱好者和IT专业人士的书籍,旨在引导读者深入理解编译器和链接器的工作原理。通过亲手构建一个简单的编译器,读者可以掌握编译器设计与实现的核心技术,提升软件开发的深度认识。...

    自己动手写编译器、链接器源代码

    4. **中间代码生成器(Code Generator)**:将AST转换为中间代码,如三地址码或字节码。这一步可以使得优化更容易实现。 5. **优化器(Optimizer)**:对中间代码进行优化,以提高生成代码的运行效率。优化可能包括...

    自己动手写编译器、链接器高清带目录PDF书籍+源码

    《自己动手写编译器、链接器》这本书是IT领域中关于编译技术的经典之作,旨在帮助读者深入理解编译器和链接器的工作原理。通过阅读这本书,你可以了解到从源代码到可执行程序的全过程,这包括词法分析、语法分析、...

    自己动手写编译器链接器

    《自己动手写编译器链接器》是一本深入探讨编译器和链接器实现的书籍,对于想要深入了解计算机系统、编程语言以及软件工程的人来说,它提供了宝贵的实践指导。该书旨在帮助读者理解编译器和链接器的工作原理,并通过...

    自己动手写编译器、链接器_编译器_

    本书介绍的SCC编译器没有借助Lex与 Yacc这些编译 器自动生成工具纯手工编写而成更便于学习和理解。为了生成可以直接运行EXE文件本书还实现了 一个链接器。读完本书读者将知道一门全新的语言如何定义一个真实的编译器...

    自己动手写mips资料以及源代码

    在这个资料包中,你将找到关于如何动手编写MIPS处理器的相关资源和源代码,这对于理解计算机硬件工作原理和深入学习数字逻辑设计非常有帮助。 首先,我们要了解MIPS的基本结构。MIPS架构通常包含五个主要部分:指令...

    编译原理实验c源代码

    4. 编写代码生成器,将三地址码转换为目标机器码。 在压缩包中的"san"文件可能包含了实验的源代码、数据文件或者编译后的可执行文件。为了运行和理解这个实验,你需要查看源代码,了解其实现细节,并在Turbo C或...

    自己动手写编译器链接器_源码

    《自己动手写编译器链接器》是一本深入解析编译器与链接器工作原理的实践教程。通过阅读这本书的源码,读者可以深入了解这两者的内部机制,这对于计算机科学和软件工程领域的专业人士来说是非常有价值的。下面我们将...

    "动手实践:动软.NET代码生成器全方位指南"

    "逐步指导您掌握动软.NET代码生成器的使用,通过全程可视化操作与实战示例,快速学会利用该工具自动生成三层架构的项目代码。"。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信...

    自已动手写开发工具 MyCompiler

    6. **中间代码生成**:编译器通常会生成一种与特定硬件无关的中间代码,如三地址码或抽象语法树,便于后续的优化和目标代码生成。 7. **代码优化**:在不影响程序语义的前提下,改进代码的运行效率,如删除冗余计算...

    编译器与编译器生成器(c++版).rar

    编译器是计算机科学中的重要组成部分,它负责将高级编程语言转换为机器可理解的指令。...通过这个C++版的编译器与编译器生成器资源,你可以深入探究这些主题,增强对编译原理的理解,甚至动手构建自己的编译工具。

    自己动手写编译器 两本

    《自己动手写编译器 两本》这套资料包含了《自己动手构造编译系统++编译、汇编与链接》和《自己动手写编译器链接器》两本书,是学习编译原理和技术的宝贵资源。这两本书深入浅出地介绍了编译器的设计与实现过程,...

    自己动手写开发工具--基于Eclipse的工具开发

    - **代码生成器的编写**:最终,通过编写代码生成器,实现枚举类型的自动创建。这部分内容对于理解如何根据用户输入生成Java代码具有重要意义。 ##### 3. 插件开发导航 - **SWT/JFace基础**:SWT和JFace是Eclipse ...

Global site tag (gtag.js) - Google Analytics