SpringBoot2.x整合Freemark、MySQL、hibernate、nutz項目搭建詳細過程

個人興趣搭建了一個自動生成java文件的項目,下面是具體步驟;

1、創建SpringBoot項目

2、自己命名項目。選擇gradle或者maven

 

3、選擇freemark服務和基礎web的服務

4、點擊下一步確認就行

5、配置服務build.gradle

plugins {
   id 'org.springframework.boot' version '2.1.5.RELEASE'
   id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.godsnet'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
   maven { url'http://maven.aliyun.com/nexus/content/groups/public' }
   mavenCentral()
}

dependencies {

   // SpringBoot base modules
   compile 'org.springframework.boot:spring-boot-starter'
   compile 'org.springframework.boot:spring-boot-starter-web'
   compile 'org.springframework.boot:spring-boot-starter-test'

   //freemarker
   compile 'org.springframework.boot:spring-boot-starter-freemarker'
   //log4j2
   compile "org.springframework.boot:spring-boot-starter-log4j2"

   //mysql JDBC
   compile 'mysql:mysql-connector-java:8.0.13'

   //Hibernate validation
   compile "org.hibernate:hibernate-validator:5.3.1.Final"

   //nutz
   compile "org.nutz:nutz-plugins-spring-boot-starter:1.r.65"
   //poi
   compile group: 'org.apache.poi', name: 'poi', version: '3.17'
   compile "org.apache.poi:poi-ooxml:3.17"
   // lombok
   compile group: 'org.projectlombok', name: 'lombok', version: '1.16.20'
   //freemarker
   compile "org.freemarker:freemarker:2.3.23"
   //druid
   compile "com.alibaba:druid-spring-boot-starter:1.1.10"

}
configurations {
   all*.exclude module: 'spring-boot-starter-logging'
   all*.exclude module: 'logback-classic'
   all*.exclude module: 'log4j-over-slf4j'
}
6、配置properties文件
#server port
server.port= 8080
server.servlet.context-path=/godsnet
###mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=

##druid連接池的設置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#初始化時建立物理連接的個數
spring.datasource.druid.initial-size=5
#最小連接池數量
spring.datasource.druid.min-idle=5
#最大連接池數量 maxIdle已經不再使用
spring.datasource.druid.max-active=20
#獲取連接時最大等待時間,單位毫秒
spring.datasource.druid.max-wait=60000
#申請連接的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
spring.datasource.druid.test-while-idle=true
#既作爲檢測的間隔時間又作爲testWhileIdel執行的依據
spring.datasource.druid.time-between-eviction-runs-millis=60000
#銷燬線程時檢測當前連接的最後活動時間和當前時間差大於該值時,關閉當前連接
spring.datasource.druid.min-evictable-idle-time-millis=30000
#用來檢測連接是否有效的sql 必須是一個查詢語句
#mysql中爲 select 'x'
spring.datasource.druid.validation-query=select 'x'
#申請連接時會執行validationQuery檢測連接是否有效,開啓會降低性能,默認爲true
spring.datasource.druid.test-on-borrow=false
#歸還連接時會執行validationQuery檢測連接是否有效,開啓會降低性能,默認爲true
spring.datasource.druid.test-on-return=false
#是否緩存preparedStatement,mysql5.5+建議開啓
#spring.datasource.druid.pool-prepared-statements=true
#當值大於0時poolPreparedStatements會自動修改爲true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#配置擴展插件
spring.datasource.druid.filters=stat,wall
#通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#合併多個DruidDataSource的監控數據
spring.datasource.druid.use-global-data-source-stat=true
7、創建連接類鏈接數據庫,獲取字段名和字段類型
package com.godsnet.godsnet.freemark;

import com.godsnet.godsnet.enums.GodsErrorCode;
import com.godsnet.godsnet.exception.GodsException;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;

public class GetEntityOnMysql {

    public Map getTableStructureByName(String databaseName) throws IOException {
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=UTC";
        String username = "root";
        String password = "";
        Map<String, String> columnNameMap = new HashMap<>();
        //加載驅動
        try {
            Class.forName(driver);
            //獲得數據庫連接
            Connection connection = DriverManager.getConnection(url, username, password);
            //獲得元數據
            DatabaseMetaData metaData = connection.getMetaData();
            //獲得表信息
            ResultSet tables = metaData.getTables(null, null, null, new String[]{"TABLE"});
            while (tables.next()) {
                columnNameMap = new HashMap<>(); //保存字段名
                //獲得表名
                String table_name = tables.getString("TABLE_NAME");
                if(table_name.equals(databaseName)){
                    //通過表名獲得所有字段名
                    ResultSet columns = metaData.getColumns(null, null, table_name, "%");
                    //獲得所有字段名
                    while (columns.next()) {
                        //獲得字段名
                        String column_name = columns.getString("COLUMN_NAME");
                        column_name = getColumnName(column_name);
                        //獲得字段類型
                        String type_name = columns.getString("TYPE_NAME");
                        columnNameMap.put(column_name,ColumnsType.valueOf(type_name).getValue());
                    }
                    break;
                }
            }
            return columnNameMap;
        }catch (ClassNotFoundException e){
            throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
        }catch (SQLException e){
            throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
        }
    }


    public String getColumnName(String column_name) throws GodsException{
        if(StringUtils.isEmpty(column_name)){
            throw new GodsException(GodsErrorCode.PARAM_MISSING,"存在表的字段名爲空");
        }
        String[] strArr = column_name.split("_");
        StringBuffer columnName = new StringBuffer();
        for(int i = 0 ; i < strArr.length ; i++){
            if(i == 0){
                columnName.append(strArr[i].toLowerCase());
            }else{
                char[] cc = strArr[i].toLowerCase().toCharArray();
                cc[0] -= 32;
                columnName.append(String.valueOf(cc));
            }
        }
        return String.valueOf(columnName);
    }
}

8、執行 模板類

package com.godsnet.godsnet.freemark;

import com.godsnet.godsnet.enums.GodsErrorCode;
import com.godsnet.godsnet.exception.GodsException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class FreemarkerCreator {
    private static final String TEMPLATE_PATH = "C:\\Program Files\\JetBrains\\godsnet\\src\\main\\java\\com\\godsnet\\godsnet\\freemark";
    private static final String CLASS_PATH = "C:\\Program Files\\JetBrains\\godsnet\\src\\main\\java\\com\\godsnet\\godsnet\\freemark";
    private static Logger logger = LoggerFactory.getLogger(FreemarkerCreator.class);

    /**
     * 創建Entity類
     * @param tableName
     */
    public static Map createEntity(String  tableName) throws GodsException {

        //  創建freeMarker配置實例
        Configuration configuration = new Configuration();
        Writer out = null;
        try {
            Map<String,String> tableMap = new HashMap<>();
            try{
                GetEntityOnMysql getEntityOnMysql = new GetEntityOnMysql();
                tableMap = getEntityOnMysql.getTableStructureByName(tableName);
            }catch (Exception e){
                throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
            }

            //  獲取模版路徑
            configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
            //  創建數據模型
            Map<String, Object> dataMap = new HashMap<>();
            dataMap.put("classPath", "com.godsnet.godsnet.freemark");
            dataMap.put("tableName",tableName);
            dataMap.put("className", getClassName(tableName));
            dataMap.put("vmap", tableMap);
            //  加載模版文件
            Template template = configuration.getTemplate("entityClass.ftl");
            //  生成數據
            File docFile = new File(CLASS_PATH + "\\" + getClassName(tableName) +".java");
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
            //  輸出文件
            template.process(dataMap, out);
            logger.info("********************Entity文件創建成功 !********************");
            return tableMap;
        } catch (Exception e) {
            throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
        } finally {
            try {
                if (null != out) {
                    out.flush();
                }
            } catch (Exception e) {
                throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
            }
        }
    }

    /**
     * 創建Controller
     * @param tableName
     * @throws GodsException
     */
    public static void createController(String tableName) throws GodsException {

        //  創建freeMarker配置實例
        Configuration configuration = new Configuration();
        Writer out = null;
        try {
            //  獲取模版路徑
            configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
            //  創建數據模型
            Map<String, Object> dataMap = new HashMap<>();
            dataMap.put("classPath", "com.godsnet.godsnet.freemark");
            dataMap.put("className", getClassName(tableName));
            //  加載模版文件
            Template template = configuration.getTemplate("controllerClass.ftl");
            //  生成數據
            File docFile = new File(CLASS_PATH + "\\" + getClassName(tableName) +".java");
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
            //  輸出文件
            template.process(dataMap, out);
            logger.info("********************Controller文件創建成功 !********************");
        } catch (Exception e) {
            throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
        } finally {
            try {
                if (null != out) {
                    out.flush();
                }
            } catch (Exception e) {
                throw new GodsException(GodsErrorCode.SYSTEM_ERROR,e.getMessage());
            }
        }
    }

    /**
     * 規範化類名稱
     * @param tableName
     * @return
     */
    public static String getClassName(String tableName){
        String[] arrStr = tableName.split("_");
        StringBuffer sb = new StringBuffer();
        for(int i = 1 ; i < arrStr.length ; i++){
            char[] cc = arrStr[i].toCharArray();
            cc[0] -= 32;
            sb.append(String.valueOf(cc));
        }
        return String.valueOf(sb);
    }

}

9、這些搞完就行了

這些我的代碼,已經上傳到GitHub了,需要的朋友可以點擊下載,也希望你能給我的GITHUB項目點個星

https://github.com/liangguojieCN/godsnet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章