【问题标题】:Building tree like structure for feeding Freemarker from JDBC构建树状结构以从 JDBC 提供 Freemarker
【发布时间】:2012-12-12 16:51:02
【问题描述】:

我想用 Groovy 和 Freemarker 生成代码(尤其是GFreeMarker)——我想生成一个用于调用存储过程的 Java 包装器。所以我用这个语句查询ORACLE:

select PACKAGE_NAME, OBJECT_NAME, POSITION, ARGUMENT_NAME, DATA_TYPE, IN_OUT
from USER_ARGUMENTS

这些数据是非规范化的(每个参数都在一行上)和分层:

- Package (PACKAGE_NAME)
  - Function (OBJECT_NAME)
    - Arguments (ARGUMENT_NAME, DATA_TYPE, IN_OUT)

我想将其存储到分层结构中,以将其提供给 Freemarker 以生成代码。这意味着我必须为每一行创建一个新的 Package 实例或选择一个现有的实例,然后创建一个新的 Function 实例或选择一个现有的实例并创建一个新参数。

这可以通过ObjectGraphBuilder 完成,还是我应该结合使用地图和列表?
这是如何以“常规方式”完成的?感谢您的帮助!

【问题讨论】:

    标签: jdbc groovy freemarker


    【解决方案1】:

    Groovy 与否,我是按以下方式完成的,请提供更好的答案,我会接受!

    首先我构建以下结构:

    Map packages = new LinkedHashMap()  
    
    class Package {
        String name
        Map functions = [:]
    }
    
    class Function {
        String name
        String returnType
        boolean isFunction = false
        Map parameters = [:]
    }
    
    class Parameter {
        String name
        String dataType
        String inOut
    }
    

    然后我用

    阅读它
    sql.eachRow("""\
        select PACKAGE_NAME, OBJECT_NAME, POSITION, ARGUMENT_NAME, DATA_TYPE, IN_OUT
        from USER_ARGUMENTS
        order by PACKAGE_NAME, OBJECT_NAME, POSITION""")
    {
        // create or get package
        def thePackage = packages[it.PACKAGE_NAME ?: '']
        if (thePackage == null) {
            thePackage = new Package(name : it.PACKAGE_NAME ?: '')
            packages[it.PACKAGE_NAME ?: ''] = thePackage
        }
    
        // create or get function
        def theFunction = thePackage.functions[it.OBJECT_NAME ?: '']
        if (theFunction == null) {
            theFunction = new Function(name: it.OBJECT_NAME ?: '')
            thePackage.functions[it.OBJECT_NAME ?: ''] = theFunction
        }
    
    
        // Position 0 is the return value
        if (it.POSITION == 0) {
            theFunction.isFunction = true
            theFunction.returnType = it.DATA_TYPE
        }
        else {
            // create the argument 
            def theParameter = new Parameter(
                name: it.ARGUMENT_NAME, dataType: it.DATA_TYPE, inOut: it.IN_OUT)
            theFunction.parameters[it.ARGUMENT_NAME ?: ''] = theParameter
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 2019-08-20
      • 1970-01-01
      • 2010-11-11
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多