1. 程式人生 > >一個java程式碼生成器的簡單實現

一個java程式碼生成器的簡單實現

最近,一直跟著公司技術牛人在搞大資料相關的東西,主要涉及的是環境搭建,同時也瞭解下整個hadoop生態系統相關的東西,真是讓我大開眼界,這個在之後的博文中再來與大家分享。 
今天,筆者給大家介紹一個程式碼生成器,這個是筆者的主管寫的,寫的確實不錯,主要是基於公司的jquery easyUI + springMVC + myBatis這套框架寫的,可以根據一個數據庫表生成model、mapper.xml、dao介面以及service、controller、jsp頁面等相關的東西,包含增刪改查等操作,節省開發時間。然後,筆者在此程式碼生成器上修改了幾個bug,同時相容了一下mysql。 
這個程式碼生成器工具使用的核心是freemarker,一個用Java語言編寫的模板引擎,它基於模板來生成文字輸出。FreeMarker與Web容器無關,即在Web執行時,它並不知道Servlet或HTTP。它不僅可以用作表現層的實現技術,而且還可以用於生成XML,JSP或Java 等。 
下面,筆者開始進行核心程式碼的介紹。 
首先,我們必須指定哪張表,然後通過jdbc獲取這個表的資訊以及表字段相關的資訊。 
這裡,將所有的配置寫入config.properties:

###資料庫表與model的對映
taskhistory=TaskHistory

###資料來源配
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.31.26.156:3306/test
username=root
password=root
db=mysql

###每個使用者對應一個同名的schema,注意配置,不然會搜尋每個schema
schemaPattern=root
tableNamePattern=%taskhistory
sEQNamePattern=%TM0101_SE

###model包名
modelPackage=com.qiyongkang.sys.model
###model儲存檔案路徑
modelSavePath=D:\\develop\\model\\ ###mapper介面包名 mapperPackage=com.qiyongkang.sys.dao ###mapper介面儲存檔案路徑 mapperSavePath=D:\\develop\\dao\\ ###mapper.xml的檔案路徑 mapperXmlSavePath=D:\\develop\\mapping\\oracle\\ ###service的包名 servicePackage=com.qiyongkang.sys.service.impl ###service的儲存檔案路徑 serviceSavePath=D:\\develop\\service\\impl\\ ###service interface的包名
serviceInterfacePackage=com.qiyongkang.sys.service ###service interface的儲存檔案路徑 serviceInterfaceSavePath=D:\\develop\\service\\ ###control包名 controllerPackage=com.qiyongkang.sys.ctrl ###control檔案路徑 controllerSavePath=D:\\develop\\ctrl\\ ###junit包名 junitPackage=com.qiyongkang.test.system.service ###junit檔案路徑 junitSavePath=D:\\develop\\test\\java\\com\\qiyongkang\\test\\system\\service\\ ###js檔案路徑 jsHomeSavePath=D:\\develop\\WebContent\\js\\modules\\system\\ ###jsp檔案路徑 jspHomeSavePath=D:\\develop\\WebContent\\WEB-INF\\views\\system\\ ###是否生成model modelFlag=true ###是否生成mapper mapperFlag=true ###是否生成mapper.xml mapperXmlFlag=true ###是否生成service serviceFlag=true ###是否生成service介面 serviceImplFlag=true ###是否生成control controlFlag=true ###是否生成junit junitFlag=false ###是否生成easyUIJs easyUIJsFlag=false ###是否生成easyUIJsp easyUIJspFlag=false ###是否生成extJs extJsFlag=false ###備份檔案路徑 fileBakPath=D:\\develop\\bakFile\\ ##專案名稱 projectName=qyk_testSpringMVC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

然後,再來看看獲取資料庫資訊相關的程式碼:

package com.codegenerator.framework.service.impl;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.codegenerator.core.utils.ConfigUtil;
import com.codegenerator.framework.model.ColumnInfo;
import com.codegenerator.framework.model.ConnectConfig;
import com.codegenerator.framework.model.ModelInfo;
import com.codegenerator.framework.model.TableInfo;
import com.codegenerator.framework.service.DataBaseService;

public class DataBaseServiceImpl implements DataBaseService {
    private static Logger logger = LogManager.getLogger(DataBaseServiceImpl.class);

    @Override
    public List<ModelInfo> loadModelInfo(ConnectConfig connectConfig) {
        ModelInfo.tableNamePex = connectConfig.getTableNamePattern();
        logger.info("表字首:{}", ModelInfo.tableNamePex);

        ModelInfo.sEQNamePex = connectConfig.getsEQNamePattern();
        logger.info("序列字首:{}", ModelInfo.sEQNamePex);

        List<ModelInfo> mList = new ArrayList<ModelInfo>();
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        logger.info("驅動類:{}", connectConfig.getDriverClassName());
        dataSource.setDriverClassName(connectConfig.getDriverClassName());

        logger.info("url:{}", connectConfig.getUrl());
        dataSource.setUrl(connectConfig.getUrl());

        logger.info("userName:{}", connectConfig.getUsername());
        dataSource.setUsername(connectConfig.getUsername());

        logger.info("password:{}", connectConfig.getPassword());
        dataSource.setPassword(connectConfig.getPassword());

        Properties pro = connectConfig.getConnectionPros();

        logger.info("設定連線屬性:{}", pro.stringPropertyNames());
        dataSource.setConnectionProperties(pro);

        Connection conn = null;
        //表查詢結果集
        ResultSet tableRS = null;

        try {
            conn = dataSource.getConnection();
            DatabaseMetaData dbMetaData = conn.getMetaData();

            logger.info("Catalog:{}", connectConfig.getCatalog());
            logger.info("SchemaPattern:{}", connectConfig.getSchemaPattern());
            logger.info("TableNamePattern:{}", connectConfig.getTableNamePattern());
            logger.info("Types:{}", Arrays.toString(connectConfig.getTypes()));

            //獲取表的結果集
            tableRS = dbMetaData.getTables(connectConfig.getCatalog(), connectConfig.getSchemaPattern(), connectConfig.getTableNamePattern(),
                    connectConfig.getTypes());

            while (tableRS.next()) {
                String tableName = tableRS.getString("TABLE_NAME");
                logger.info("tableName:{}", tableName);
                if (tableName.indexOf("$") == -1 && !connectConfig.getExclusionMap().containsKey(tableName)) {
                    if (ConfigUtil.getConfig(tableName) == null) {
                        continue;
                    }
                    ModelInfo modelInfo = new ModelInfo();
                    TableInfo tableInfo = new TableInfo();
                    tableInfo.setName(tableName)