自動生成資料庫表設計(一)之獲取JDBC獲取元資料
最近專案快了驗收,那麼接下來就是寫一些比較煩人的文件,在寫資料庫設計文件時,到了詳細設計這一塊有點尷尬了,每張表,沒個欄位都要寫上去,由於前期沒有整理,所以這個工作量還是很大,我查看了我們的資料庫發現有353張表,這樣寫,得花多久的時間啊。。。於是想通過程式來自動完成,這就是這篇文章的核心。
本篇主要內容:
1、配置Maven工程
2、資料庫元資料的獲取
配置Maven工程
1、新建Maven工程
1.建立工程我這裡建立的moudle類似於Eclipse的工程
2.指定Moudle路徑
3.點選OK,編輯pom.xml (無所謂)
4.在main下新建lib資料夾,我們要拷貝Oracle的jdbc的jar包,我沒找到maven依賴
2、配置工程
1.建立好工程後,開始配置工程,由於我們的資料庫是Oracle11g,這裡我們先找到Oracle的JDBC的jar包,找到 安裝目錄下的product\11.2.0\dbhome_1\jdbc\lib 的odbc6.jar拷貝到工程的lib下
2.將jar包新增到依賴
選中工程-右鍵-open moudle settings
第4步選中我們odbc6所在的目錄,也就是剛才新建的lib包
至此我們的工程配置完成。
資料庫元資料的獲取
1、預覽模版樣式確定需求(前提是你的資料庫已經存在這些資訊)
獲取的內容有:
表:表名、表註釋
列:列名、列註釋、欄位型別、預設值
那麼我們就要獲取資料庫的這些東西。
根據表名獲取列資訊的SQL
SELECT
utc.table_name,utc.column_name,utc.data_type,utc.data_length,utc.data_default,ucc.comments,p.PRIMARY_KEY
FROM
user_tab_columns utc
LEFT JOIN --查詢註釋
user_col_comments ucc
ON
utc.table_name = ucc.table_name
AND
utc.column_name = ucc.column_name
LEFT JOIN --查詢主鍵
(
SELECT
col.table_name table_name,
col.column_name column_name,
CASE con.constraint_type WHEN 'P' THEN 'true' ELSE 'false' END "PRIMARY_KEY"
FROM
user_constraints con,
user_cons_columns col
WHERE
con.constraint_name = col.constraint_name
AND
con.constraint_type = 'P'
) p
ON
utc.column_name = p.column_name
AND
p.table_name = utc.table_name
WHERE
utc.table_name = 'YJ_HL';
結果如下:
獲取資料庫表資訊的SQL
SELECT * FROM user_tab_comments WHERE table_type='TABLE'
這裡就不顯示了,設計公司業務了
ok現在我們基本資訊用sql已經完成,那麼用jdbc執行這些sql基本就完成獲取資料庫元資料資訊了。
3、編寫JDBC獲取元資料資訊
getTableList如下
// 獲取資料庫中所有表的表名,並新增到列表結構中。
public static List getTableList(Connection conn) throws SQLException {
List<Map> tableList = new ArrayList<Map>();
String sql =
"SELECT * FROM user_tab_comments WHERE table_type='TABLE'";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Map map = new HashMap<>();
String TABLE_NAME = rs.getString("TABLE_NAME");
String COMMENTS = rs.getString("COMMENTS");
map.put("TABLE_NAME", TABLE_NAME);
map.put("COMMENTS", COMMENTS == null ? "" : COMMENTS);
//獲取列
List<Map> columnList = getColumnList(conn, TABLE_NAME);
map.put("COLUMNS", columnList);
//這裡是過濾特殊的表,比如只生成SYS開頭的表
if (TABLE_NAME.startsWith("SYS"))
tableList.add(map);
System.out.println("TABLE_NAME ==>" + TABLE_NAME + " COMMENTS==>" + COMMENTS);
}
rs.close();
ps.close();
return tableList;
}
getColumnList如下
// 獲取資料表中所有列的列名,並新增到列表結構中。
public static List getColumnList(Connection conn, String tableName)
throws SQLException {
List<Map> columnList = new ArrayList<Map>();
String sql =
"SELECT utc.table_name,utc.column_name,utc.data_type,utc.data_length,utc.data_default,utc.nullable,ucc.comments,p.PRIMARY_KEY " +
"FROM user_tab_columns utc " +
"LEFT JOIN user_col_comments ucc " + //--查詢註釋
"ON utc.table_name = ucc.table_name " +
"AND utc.column_name = ucc.column_name " +
"LEFT JOIN " + //--查詢主鍵
"( SELECT col.table_name table_name, col.column_name column_name, CASE con.constraint_type WHEN 'P' THEN 'true' ELSE 'false' END PRIMARY_KEY " +
"FROM user_constraints con,user_cons_columns col " +
"WHERE con.constraint_name = col.constraint_name " +
"AND con.constraint_type = 'P') p " +
"ON utc.column_name = p.column_name " +
"AND p.table_name = utc.table_name " +
"WHERE utc.table_name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, tableName);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Map map = new HashMap<>();
String COLUMN_NAME = rs.getString("COLUMN_NAME");
String DATA_TYPE = rs.getString("DATA_TYPE");//VARCHAR2
String DATA_LENGTH = rs.getString("DATA_LENGTH");//200
String DATA_DEFAULT = rs.getString("DATA_DEFAULT");
String NULLABLE = rs.getString("NULLABLE");
String COMMENTS = rs.getString("COMMENTS");
String PRIMARY_KEY = rs.getString("PRIMARY_KEY");
map.put("COLUMN_NAME", COLUMN_NAME);
map.put("DATA_TYPE", DATA_TYPE);
map.put("DATA_LENGTH", DATA_LENGTH);
map.put("DATA_DEFAULT", DATA_DEFAULT == null ? "" : DATA_DEFAULT);
map.put("NULLABLE", "N".equals(NULLABLE) ? false : true);
map.put("COMMENTS", COMMENTS == null ? "" : COMMENTS);
map.put("PRIMARY_KEY", "true".equals(PRIMARY_KEY) ? true : false);
columnList.add(map);
System.out.println("COLUMN_NAME ==>" + COLUMN_NAME + " DATA_TYPE==>" + DATA_TYPE + " DATA_LENGTH==>" + DATA_LENGTH + " NULLABLE==>" + NULLABLE + " COMMENTS==>" + COMMENTS + " PRIMARY_KEY==>" + PRIMARY_KEY);
}
rs.close();
ps.close();
return columnList;
}
4、測試
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");
List<Map> tableList = getTableList(conn);
conn.close();
FtUtil ftUtil = new FtUtil();
Map map = new HashMap<>();
map.put("table", tableList);
ftUtil.generateFile("/", "moban.xml", map, "D:/", "sys_moban.doc");
}
列印結果如下:
至此,我們基本完成需求中所需要的資料了
下一篇,我們講Freemarker簡單的使用。