1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/htengen-codgen

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

1. Что такое Codgen?

Codgen — это генератор кода, основанный на модели метаданных базы данных и использующий шаблонизатор Freemarker для построения выходных данных. Модель данных Freemarker обычно представляет собой древовидную структуру типа Map, и Codgen не является исключением. Корневой узел этого дерева обычно содержит объект TableModel (модель данных таблицы). TableModel, как следует из названия, состоит из метаданных одной таблицы базы данных, а с помощью этой модели данных и многоуровневой архитектуры шаблонов можно генерировать многоуровневый код на основе этой таблицы.

В целом, Codgen имеет следующие основные функции и характеристики:

  • Использует формулу построения Freemarker: данные + шаблон = вывод. По умолчанию используется шаблонизатор FreeMarker для генерации кода, но через интерфейс Builder можно реализовать другие способы построения.
  • Ядро данных TableModel основано на JDBC для инкапсуляции метаданных таблицы и всех её столбцов.
  • Модель данных TableModel основана на JDBC и может получить большую часть метаданных, некоторые конкретные метаданные зависят от диалекта базы данных, который можно реализовать через расширение DbProvider.
  • Через реализацию интерфейса ColumnHandler можно выполнять преобразование типов данных JDBC в различные типы языков программирования и более сложные операции, такие как обработка заглавных букв в именах столбцов Oracle для улучшения читаемости имён.
  • Можно динамически добавлять или переопределять модель данных через конфигурацию, и она может быть использована последующими моделями данных через язык шаблонов или сборку.
  • Указанный при построении шаблон может быть текстовой строкой или путём к файлу, и их содержимое может ссылаться на уже определённые модели данных.
  • Тип вывода, указанный при построении, может быть текстом или файлом, и путь к выходному файлу также может ссылаться на переменные модели данных.
  • Проект конфигурации включает механизм наследования, что позволяет повторно использовать уже определённые модели данных и другую конфигурацию в родительском классе.
  • Информация о конфигурации проекта может храниться в нескольких файлах конфигурации, и Codgen загружает и кэширует их сразу, чтобы ускорить последующий доступ.

2. Как использовать Codgen

2.1. Скачайте последние версии codgen.jar и зависимых пакетов

Поскольку Codgen не является самостоятельным проектом, он опирается на некоторые популярные открытые фреймворки. Помимо загрузки последнего файла пакета codgen.jar, необходимо загрузить следующие файлы jar:

  • commons-lang.jar или совместимую версию;
  • commons-logging.jar или совместимую версию;
  • log4j-1.2.14 или совместимую версию;
  • freemarker-2.3.13 или совместимую версию.

Помимо этих четырёх обязательных пакетов с открытым исходным кодом, поскольку метаданные Codgen получены через JDBC, также необходимо загрузить соответствующий драйвер JDBC для вашей базы данных. В настоящее время Codgen по умолчанию поддерживает только версии баз данных Oracle 10g, SQL Server 2000 и SQL Server 2005. Однако вы можете расширить поддержку других версий баз данных, реализовав интерфейс DbProvider, предоставляемый Codgen.

  • Драйвер JDBC для Oracle 10g: ojdbc14.jar;
  • Драйверы JDBC для SQL Server 2000: msbase.jar, mssqlserver.jar и msutil.jar;
  • Драйвер JDBC для SQL Server 2005: sqljdbc.jar.

Примечание: JDK 1.6.0_13 или более поздняя версия.

2.2. Напишите файл конфигурации Codgen

Хотя можно выполнить всю операцию сборки без использования файла конфигурации, рекомендуется использовать файл конфигурации для объявления некоторых зависимостей сборки, таких как объявление переменных модели данных, объявление переменных выходной модели и информация о поставщике данных базы данных, которые могут быть отделены от кода. Ниже приведён пример полного файла конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE codgen-config PUBLIC "-//Apache Software Foundation//DTD Tengen Configuration 1.0//EN" "com/bcs/codgen/resources/codgen-config_1_0.dtd">
<codgen-config>
        <project name="AOWork" label="工程验收" outputEncoding="GBK" isDefault="true" extends="defaultProject">
                <dbProvider class="com.bcs.codgen.service.impl.Sql2005Provider">
                        <jdbcConfig>
                                <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>
                                <url>jdbc:sqlserver://127.0.0.1\SQL2005;DatabaseName=MUCM_DG;selectMethod=cursor</url>
                                <user>sa</user>
                                <password>sa</password>
                        </jdbcConfig>
                        <columnHandler class="com.bcs.codgen.service.impl.DataTypeConverterForJava"/>
            <!-- 自定义的列模型处理器,用来把oracle带下划线的列名称转换为驼峰式列名称 -->
            <columnHandler class="columnHandler.OracleColumnHandler"/>
            <!-- 不使用系统默认的空格分隔符(要使用则去掉下面这行配置,当然可以设置其他分隔符来覆盖默认的空格分隔符) -->
            <splitorForLabelFromComment></splitorForLabelFromComment>
                </dbProvider>
        <!-- 自定义的构建配置处理器,可以在配置信息初始化、获取数据模型前后、获取输出模型前后时进行定制处理 -->
        <buildConfigHandler class="buildConfigHandler.MyBuildConfigHandler" />
                
                <dataModel name="templateDirectory">template/AOWork</dataModel>
                <dataModel name="outputDirectory">D:/QtoneProject/TengenCode/${copyright.author}/${projectName}</dataModel>
                <dataModel name="NamespaceModel" >com.qtone.aow.model.${groupName}</dataModel>
                <dataModel name="NamespaceParam">com.qtone.aow.model.${groupName}</dataModel>
                <dataModel name="NamespaceDao">com.qtone.aow.dao.${groupName}</dataModel>
                <dataModel name="NamespaceDaoImpl">com.qtone.aow.dao.${groupName}</dataModel>
                <dataModel name="NamespaceBll">com.qtone.aow.bll.${groupName}</dataModel>
                <dataModel name="NamespaceBllImpl">com.qtone.aow.bll.${groupGroup}</dataModel>
                <dataModel name="NamespaceApp">com.qtone.aow.app.${groupName}</dataModel>
                                
                <template name="tDao" type="file">dao.ftl</template>
                
                <output name="Model" type="text" templateText="${defaultJavaModel}" ></output>
                <output name="Param" type="text" templateFile="Param.ftl" ></output>
                <output name="Dao" type="text"

Здесь представлен перевод исходного текста на русский язык. Если у вас есть дополнительные вопросы или уточнения, пожалуйста, сообщите мне. **2.2.1 project узел**

Проект — это минимальная единица сборки.

* **name**: название проекта, которое должно быть уникальным во всех конфигурациях загрузки.
* **label**: ярлык проекта, информация на китайском языке для отображения на переднем плане.
* **outputEncoding**: тип выходной кодировки, который должен соответствовать типу кодировки шаблона, иначе в выходном файле или появится искажённый текст.
* **isDefault**: является ли проект по умолчанию, если есть несколько проектов, установленных как свойства по умолчанию (isDefault="true"), то будет использоваться последний.
* **extends**: указывает на наследование ранее настроенного существующего проекта, при загрузке и создании объекта конфигурации проекта, если обнаружено это свойство, сначала будет получен скопированный унаследованный проект, а затем будет прочитана текущая конфигурация проекта, если существует повторяющийся дочерний узел, он будет перекрыт.
* **isEnabled**: включено ли, если это свойство не установлено, оно по умолчанию включено, что эквивалентно isEnabled ="true", отключённые проекты не будут загружены в кэш конфигурации и, следовательно, не могут быть унаследованы последующими проектами.

**2.2.2 dbProvider узел**

Этот узел используется для настройки поставщика информации о базе данных, используемой текущим проектом, и не является обязательным узлом конфигурации. dbProvider обычно содержит один или несколько дочерних узлов jdbcConfig и columnHandler, но они также не являются обязательными для настройки, их можно настроить в программировании, например, jdbcConfig можно указать непосредственно объект JdbcConfig или передать объект подключения Connection в программировании без настройки. Другими словами, DbProvider предоставляет два метода построения с параметрами JdbcConfig и Connection. Узел DbProvider имеет только одно свойство class, которое указывает конкретную реализацию базы данных определённого типа, такую как OracleProvider, которая является классом реализации DbProvider для предоставления информации метаданных Oracle. Codgen также реализовал некоторые другие базы данных, такие как MsSQL, вы также можете наследовать DbProvider для расширения своего собственного поставщика информации о базе данных. Это очень просто, потому что DbProvider уже реализовал большую часть функций, вам нужно только реализовать один или два абстрактных метода, чтобы расширить свой собственный dbProvider, и использовать свойство class в конфигурации, чтобы указать полное имя класса.

**2.2.3 jdbcConfig узел**

Используется для указания конфигурации соединения JDBC, включая driver, url, user и password и т. д.

**2.2.4 columnHandler узел**

columnHandler — обработчик модели столбца. Он является дочерним узлом dbProvider. Один поставщик информации о базе данных может содержать несколько обработчиков моделей столбцов. После получения связанной информации о полях из базы данных она инкапсулируется в объект модели столбца, и эти обработчики будут вызываться для выполнения некоторых специальных операций обработки, таких как преобразование типа данных поля базы данных в тип данных фактического языка программирования. Например, все имена полей Oracle являются прописными, здесь можно добавить обработчик для унификации преобразования имени поля в более читаемое имя поля, как показано в следующем коде:

ProjectConfig projectConfig = ProjectConfigHelper.getDefaultProjectConfig("codgen-config.xml"); // Добавляем дополнительный обработчик модели столбцов для обработки больших имён столбцов Oracle для улучшения читаемости имён столбцов

Хотя у обработчика модели столбцов есть только один метод handle, этот простой интерфейс может реализовывать множество гибких и мощных функций. Вот ещё один пример использования этого обработчика:

/**

  • Преобразование имени столбца Oracle с подчёркиванием в верблюжий регистр
  • @author tengen

*/ public class OracleColumnHandler implements ColumnHandler{ public void handle(ColumnModel col) { //Java заменяет подчёркивание и делает следующую букву заглавной
StringBuffer sb = new StringBuffer();
sb.append(col.getColumnName().toLowerCase());
int count = sb.indexOf("");
while(count!=0){
int num = sb.indexOf("
",count);
count = num+1;
if(num!=-1){
char ss = sb.charAt(count);
char ia = (char) (ss - 32);
sb.replace(count,count+1,ia+"");
}
}
String ss = sb.toString().replaceAll("_",""); col.setColumnName(ss); } }

Фактически, codgen предоставляет два типичных примера использования обработчиков модели столбцов: DataTypeConverterForJava и DataTypeConverterForCS, которые используются для преобразования типов данных для разных сред программирования.

**2.2.5 splitorForLabelFromComment узел**

splitorForLabelFromComment — узел конфигурации разделителя для извлечения метки таблицы (столбца) из комментария таблицы (столбца). Codgen по умолчанию использует пробел в качестве разделителя, например, tableComment имеет значение «информация о пользователе, используемая для хранения основных сведений о преподавателях, родителях и студентах», тогда значение tableLabel равно «информация о пользователе»; columnComment установлен на «код пользователя|сгенерированный UUID, удалённый из 32-битного кода после удаления подчёркивания», а значение splitorForLabelFromComment равно «|», тогда значение columnLabel равно «код пользователя».

**2.2.6 buildConfigHandler узел**

buildConfigHandler — это узел обработчика конфигурации сборки, который позволяет пользователям настраивать дополнительные обработчики конфигурации сборки для индивидуальной обработки конфигурации проекта и конфигурации сборки до и после инициализации проекта, получения модели данных и получения выходной модели. Следующий обработчик конфигурации сборки перехватывает инициализацию проекта и автоматически заполняет неустановленные значения groupName, moduleName и т.д. в соответствии с соглашением об именовании, заданным именем таблицы. ```
StringUtils.countMatches(tableName, "_");
if (splitorCount >= 2) {
    tableName = tableName.replace("qky_", "");
}
//把表名中第一个和第三个下划线之间的内容作为组名
if (tableName.contains("_")) {
    String groupName = StringUtils.substringBefore(tableName, "_");
    pbConfig.setGroupName(groupName);
}

pbConfig.setModuleName(removeSplitorAndCapitalize(tableName, "_"));
}

//表标签格式化
String tableLabel = pbConfig.getTableLabel();
if (StringUtils.isNotBlank(tableLabel)) {
    if (tableLabel.indexOf("|") > 0) {
        tableLabel = StringUtils.substringBefore(tableLabel, "|");
    }
    //去掉后缀字符“表”后再作为表标签
    tableLabel = StringUtils.removeEnd(tableLabel, "表");
    pbConfig.setTableLabel(tableLabel);
}

2.2.5 dataModel узел

dataModel указывает на модель данных, которая используется для определения группы данных, которые должны быть динамически заменены в шаблоне. Проще говоря, это пара ключ-значение, где имя — это имя ключа, а содержимое узла — соответствующее значение. Например, следующий код представляет собой данные с именем «codgen»:

<dataModel name="codgen">myCodgen</dataModel>

Определённые ранее модели данных могут быть вложены в последующие модели данных. Например:

<dataModel name="helloCodgen">hello,${codgen}!</dataModel>

После разбора будет выведено следующее: hello,myCodgen!

Из примера конфигурации можно увидеть, что в настоящее время в файле конфигурации через тег dataModel можно определить только простые модели данных, такие как ${copyright.author}. Для более сложных объектов, таких как модели данных объектов, необходимо определить их в коде:

copyright.setAuthor("黄天政");
dataModelMap.put("copyright",copyright); //dataModelMap — это дерево моделей данных```

Модели данных, подобные copyright, являются одноуровневыми узлами в дереве моделей данных и включают в себя все модели данных, объявленные в файле конфигурации. codgen предоставляет основную модель данных TableModel, помимо других встроенных моделей данных:

* **projectName** — название проекта, по умолчанию используется значение атрибута name узла project в файле конфигурации;
* **projectLabel** — описание проекта на китайском языке, по умолчанию используется атрибут label узла project в файле конфигурации;
* **tableName** — имя таблицы, без значения по умолчанию, должно быть указано явно, иначе невозможно создать объект модели таблицы TableModel;
* **tableLable** — ярлык таблицы, по умолчанию берётся из комментария к таблице, если не найден, устанавливается равным имени таблицы;
* **groupName** — группа имён, если имя таблицы соответствует формату Sys_UserInfo, то по умолчанию устанавливается Sys в качестве группы имён;
* **moduleName** — модуль имён, если имя таблицы соответствует формату Sys_UserInfo, то по умолчанию устанавливается UserInfo в качестве модуля имён;
* **copyright** — объект авторских прав, каждый атрибут имеет значение по умолчанию, подробности см. в соответствующей документации API;
* **templateDirectory** — каталог шаблонов по умолчанию, по умолчанию равен относительному пути класса «template/название проекта», обратите внимание, что здесь название проекта не является именем приложения, а является названием узла проекта в файле конфигурации, например, в конфигурации проекта «AOWork» путь по умолчанию — «template/AOWork», конечно, это значение по умолчанию можно переопределить в файле конфигурации, чтобы заменить значение по умолчанию в коде.

Примечание:

Имя модели данных TableModel не «tableModel», а «table»;
Все вышеперечисленные модели данных можно напрямую использовать в файле конфигурации, как показано ниже, две модели данных «copyright.author» и «projectName» используются в определении модели данных:

```<dataModel name="outputDirectory">D:/QtoneProject/TengenCode/${copyright.author}/${projectName}</dataModel>```

**2.2.6 template узел**

Узел template имеет только два атрибута: name и type, которые представляют имя шаблона и тип шаблона соответственно. Тип шаблона также имеет только два значения перечисления: file и text. Узел template не является обязательным узлом проекта, обычно он используется, когда содержимое шаблона велико и его тип — text, или когда тип указан как file, и в этом случае содержимое узла представляет путь к шаблону, а не содержимое шаблона. Ниже приведён пример определения шаблона, связанного с информацией об авторских правах:

```<template name="tModel" type="text">  
<![CDATA[  
    ${defaultCopyright}    
    ${defaultJavaModelWithNoCopyright}  
]]>  
</template> 

где defaultCopyright и defaultJavaModelWithNoCopyright — две предварительно определённые модели данных codgen.

2.2.7 output узел

output указывает цель сборки вывода, его атрибуты и описание следующие:

name

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Codgen — это генератор кода, который работает на основе модели метаданных базы данных и использует шаблонизатор Freemarker для создания выходных данных. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/htengen-codgen.git
git@api.gitlife.ru:oschina-mirror/htengen-codgen.git
oschina-mirror
htengen-codgen
htengen-codgen
master