個人興趣搭建了一個自動生成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項目點個星