結構說明
項目結構非常簡單将饺,主要就creator下的3個類,讀取數(shù)據(jù)庫后記錄的數(shù)據(jù)庫結構信息保存到txt文件夾下战转,??表對應??txt文件搜立。
1502862396067.jpg
Column.java 字段
package creator;
public class Column {
// 數(shù)據(jù)庫字段名稱
private String field;
// 服務端model屬性名稱
private String param;
// 數(shù)據(jù)庫字段類型
private String type;
// 數(shù)據(jù)庫字段注釋
private String comment;
public Column(String field, String param, String type, String comment) {
this.field = field;
this.param = param;
this.type = type;
this.comment = comment;
}
// 此處省略getter setter
}
Table.java 表
package creator;
import java.util.List;
public class Table {
// 數(shù)據(jù)庫表名
private String tableName;
// 服務端model名
private String objectName;
// 數(shù)據(jù)庫表的建表語句
private String comment;
// 表包含的字段
private List<Column> columns;
public Table(String tableName, String objectName) {
this.tableName = tableName;
this.objectName = objectName;
}
// 此處省略getter setter
}
Runner.java 運行類
package creator;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* 讀取mysql數(shù)據(jù)庫下表的結構信息
*/
public class Runner {
public static void main(String[] args) throws Exception {
// 獲取數(shù)據(jù)庫下的所有表名稱
List<Table> tables = getAllTableName();
// 獲得表的建表語句
buildTableComment(tables);
// 獲得表中所有字段信息
buildColumns(tables);
// 寫文件
write(tables);
}
/**
* 寫文件
*/
private static void write(List<Table> tables) {
for (Table table : tables) {
System.out.println(table.getTableName());
StringBuilder buffer = new StringBuilder();
buffer.append("**表名:**" + table.getTableName() + "\n");
buffer.append("**對象:**" + table.getObjectName() + "\n");
buffer.append("**說明:**" + table.getComment() + "\n\n");
buffer.append("------------\n");
buffer.append("|參數(shù)|類型|說明|\n");
buffer.append("|:-------|:-------|:-------|\n");
List<Column> columns = table.getColumns();
for (Column column : columns) {
String param = column.getParam();
if ("del".equals(param) || "delDtm".equals(param)) continue;
String type = column.getType();
String comment = column.getComment();
buffer.append("|" + param + "|" + type + "|" + ("".equals(comment) ? "無" : comment) + "|\n");
}
String content = buffer.toString();
String path = System.getProperty("user.dir") + "/creator/txt/" + table.getObjectName() + ".txt";
try {
content = content.replaceAll("'", "\"");
FileUtils.writeStringToFile(new File(path), content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 連接數(shù)據(jù)庫
*/
private static Connection getMySQLConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
return conn;
}
/**
* 獲取當前數(shù)據(jù)庫下的所有表名稱
*/
private static List<Table> getAllTableName() throws Exception {
List<Table> tables = new ArrayList<>();
Connection conn = getMySQLConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SHOW TABLES");
while (rs.next()) {
String tableName = rs.getString(1);
String objectName = camelCase(tableName);
Table table = new Table(tableName, objectName);
tables.add(table);
}
rs.close();
stmt.close();
conn.close();
return tables;
}
/**
* 獲得某表的建表語句
*/
private static void buildTableComment(List<Table> tables) throws Exception {
Connection conn = getMySQLConnection();
Statement stmt = conn.createStatement();
for (Table table : tables) {
ResultSet rs = stmt.executeQuery("SHOW CREATE TABLE " + table.getTableName());
if (rs != null && rs.next()) {
String createDDL = rs.getString(2);
String comment = parse(createDDL);
table.setComment(comment);
}
if (rs != null) rs.close();
}
stmt.close();
conn.close();
}
/**
* 獲得某表中所有字段信息
*/
private static void buildColumns(List<Table> tables) throws Exception {
Connection conn = getMySQLConnection();
Statement stmt = conn.createStatement();
for (Table table : tables) {
List<Column> columns = new ArrayList<>();
ResultSet rs = stmt.executeQuery("show full columns from " + table.getTableName());
if (rs != null) {
while (rs.next()) {
String field = rs.getString("Field");
String type = rs.getString("Type");
String comment = rs.getString("Comment");
Column column = new Column(field, camelCase(field), type, comment);
columns.add(column);
}
}
if (rs != null) {
rs.close();
}
table.setColumns(columns);
}
stmt.close();
conn.close();
}
/**
* 返回注釋信息
*/
private static String parse(String all) {
String comment;
int index = all.indexOf("COMMENT='");
if (index < 0) {
return "";
}
comment = all.substring(index + 9);
comment = comment.substring(0, comment.length() - 1);
return comment;
}
/**
* 例如:employ_user_id變成employUserId
*/
private static String camelCase(String str) {
String[] str1 = str.split("_");
int size = str1.length;
String str2;
StringBuilder str4 = null;
String str3;
for (int i = 0; i < size; i++) {
if (i == 0) {
str2 = str1[i];
str4 = new StringBuilder(str2);
} else {
str3 = initcap(str1[i]);
str4.append(str3);
}
}
return str4.toString();
}
/**
* 把輸入字符串的首字母改成大寫
*/
private static String initcap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}
}
結果示例
生成的數(shù)據(jù)庫結構數(shù)據(jù)為Markdown標記語言風格的文本。
**表名:**user
**對象:**user
**說明:**用戶
------------
|參數(shù)|類型|說明|
|:-------|:-------|:-------|
|id|int(11)|無|
|createDtm|datetime|[創(chuàng)建時間]|
|nickname|varchar(255)|[昵稱]|
|address|varchar(255)|[聯(lián)系地址]|
|phone|varchar(12)|[電話]|
|contact|varchar(255)|[聯(lián)系方式]|
|email|varchar(255)|[郵箱]|
|headImg|varchar(255)|[頭像]|
|password|varchar(40)|[密碼]|
|sex|int(2)|[性別] 0:保密 1:男 2:女 |
將其使用Markdown風格展示效果為
參數(shù) | 類型 | 說明 |
---|---|---|
id | int(11) | 無 |
createDtm | datetime | [創(chuàng)建時間] |
nickname | varchar(255) | [昵稱] |
address | varchar(255) | [聯(lián)系地址] |
phone | varchar(12) | [電話] |
contact | varchar(255) | [聯(lián)系方式] |
varchar(255) | [郵箱] | |
headImg | varchar(255) | [頭像] |
password | varchar(40) | [密碼] |
sex | int(2) | [性別] 0:保密 1:男 2:女 |