zoukankan      html  css  js  c++  java
  • JeeSite学习笔记~代码生成原理

    1.建立数据模型【单表,一对多表,树状结构表】

    ERMaster建立数据模型,并设定对应表,建立关联关系

    2.系统获取对应表原理

    1.怎样获取数据库的表

    genTableForm.jsp

    <label class="control-label">表名:</label>

    <div class="controls">

    <form:select path="name" class="input-xxlarge">

    <form:options items="${tableList}" itemLabel="nameAndComments" itemValue="name" htmlEscape="false"/>

    </form:select>

    </div>

    GenTableController:

    // 获取物理表列表

    List<GenTable> tableList = genTableService.findTableListFormDb(new GenTable());

    model.addAttribute("tableList", tableList);

    GenDataBaseDictDao.xml

    //根据name查询数据库对应的表

    <select id="findTableList" resultType="GenTable">

    <if test="dbName == 'oracle'">

    SELECT

    t.TABLE_NAME AS name,

    c.COMMENTS AS comments

    FROM user_tables t, user_tab_comments c

    WHERE t.table_name = c.table_name

    <if test="name != null and name != ''">

    AND t.TABLE_NAME = upper(#{name})

    </if>

    ORDER BY t.TABLE_NAME

    </if>

    </select>

    注:user_tables:当前用户拥有的表 

    user_tab_comments:获取表的注释

    //判断是否已生成表

    SELECT

    t.COLUMN_NAME AS name,<!--

    t.DATA_TYPE,

    t.DATA_LENGTH,

    t.DATA_PRECISION,

    t.DATA_SCALE, -->

    (CASE WHEN t.NULLABLE = 'Y' THEN '1' ELSE '0' END) AS isNull,

    (t.COLUMN_ID * 10) AS sort,

    c.COMMENTS AS comments,

    decode(t.DATA_TYPE,'DATE',t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',

    'VARCHAR2', t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',

    'VARCHAR', t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',

    'NVARCHAR2', t.DATA_TYPE || '(' || t.DATA_LENGTH/2 || ')',

    'CHAR', t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',

    'NUMBER',t.DATA_TYPE || (nvl2(t.DATA_PRECISION,nvl2(decode(t.DATA_SCALE,0,null,t.DATA_SCALE),

    '(' || t.DATA_PRECISION || ',' || t.DATA_SCALE || ')',

    '(' || t.DATA_PRECISION || ')'),'(18)')),t.DATA_TYPE) AS jdbcType

    FROM user_tab_columns t, user_col_comments c

    WHERE t.TABLE_NAME = c.table_name

    AND t.COLUMN_NAME = c.column_name

    <if test="name != null and name != ''">

    AND t.TABLE_NAME = upper(#{name})

    </if>

    ORDER BY t.COLUMN_ID

    2.业务表配置,代码生成

    代码生成工具类:GenUtils

    XmlJava类:JaxbMapper

    调用方法:

    代码生成配置对象getConfig()

    XML文件转换为对象fileToObject(String fileName, Class<?> clazz)

    根据分类获取模板列表:

    getTemplateList(GenConfig config, String category, boolean isChildTable)

    获取数据模型:getDataModel(GenScheme genScheme)

    调用模板XMLconfig.xml

    对应映射:GenConfig.java---config.xml

    2.代码生成的路径设置

    默认生成路径:D:\src\main

        Java代码:D:\src\main\java\com\thinkgem\jeesite\modules

    Dao.xml:D:\src\main\resources\mappings\modules

    Web代码:D:\src\main\webapp\WEB-INF\views\modules

    调用代码生成工具类:GenUtils,

    路径生成类:Global,

    调用方法:generateToFile(),getProjectPath()

    String fileName = Global.getProjectPath() + File.separator 

    + StringUtils.replaceEach(FreeMarkers.renderString(tpl.getFilePath() + "/", model),

    new String[]{"//", "/", "."}, new String[]{File.separator, File.separator, File.separator})

    + FreeMarkers.renderString(tpl.getFileName(), model);

    路径配置设置:jeesite.properties:144

           projectPath=D\:\\workspace\\jeesite

    3.菜单配置,权限设置

     树状图结构

    权限:

    访问路径:

    @Controller

    @RequestMapping(value = "${adminPath}/workers/hlTest")

    查看权限:

    @RequiresPermissions("workers:hlTest:view")

    编辑权限:

    @RequiresPermissions("workers:hlTest:edit")

    生成代码原理总结:

    JeeSite生成代码原理主要是:通过JAXBContextMarshal(解组) 和 UnMarshal(编组)实现javaxml的相互转换,其中把要生成代码的文件写成一个XML模板,再通过IO流一行一行读取模板,再进行转换成相应的文件!

    具体参看代码(config.xml,GenUtils.java,GenSchemeService.java

  • 相关阅读:
    Django
    python django框架学习
    Http Header里的Content-Type
    Python 头部 #!/usr/bin/python 和 #!/usr/bin/env python的区别
    关于“编译型语言”和“解释性语言”的区别
    Axure XMind整理交互思路
    异常处理
    re模块
    模块
    正则表达式**************************
  • 原文地址:https://www.cnblogs.com/26JRS/p/6084082.html
Copyright © 2011-2022 走看看