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
Xml轉 Java類:JaxbMapper
調用方法:
代碼生成配置對象:getConfig()
XML文件轉換為對象:fileToObject(String fileName, Class<?> clazz)
根據分類獲取模板列表:
getTemplateList(GenConfig config, String category, boolean isChildTable)
獲取數據模型:getDataModel(GenScheme genScheme)
調用模板XML:config.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生成代碼原理主要是:通過JAXBContext的Marshal(解組) 和 UnMarshal(編組)實現java與xml的相互轉換,其中把要生成代碼的文件寫成一個XML模板,再通過IO流一行一行讀取模板,再進行轉換成相應的文件!
具體參看代碼(config.xml,GenUtils.java,GenSchemeService.java)