1. 程式人生 > >自動生成資料庫表設計(一)之獲取JDBC獲取元資料

自動生成資料庫表設計(一)之獲取JDBC獲取元資料

最近專案快了驗收,那麼接下來就是寫一些比較煩人的文件,在寫資料庫設計文件時,到了詳細設計這一塊有點尷尬了,每張表,沒個欄位都要寫上去,由於前期沒有整理,所以這個工作量還是很大,我查看了我們的資料庫發現有353張表,這樣寫,得花多久的時間啊。。。於是想通過程式來自動完成,這就是這篇文章的核心。

本篇主要內容:
1、配置Maven工程
2、資料庫元資料的獲取

配置Maven工程

1、新建Maven工程
1.建立工程我這裡建立的moudle類似於Eclipse的工程

新建一個db-generator的Moudle

2.指定Moudle路徑

指定Moudle路徑

3.點選OK,編輯pom.xml (無所謂)

點選ok即可

4.在main下新建lib資料夾,我們要拷貝Oracle的jdbc的jar包,我沒找到maven依賴

建立完成的結構目錄

2、配置工程
1.建立好工程後,開始配置工程,由於我們的資料庫是Oracle11g,這裡我們先找到Oracle的JDBC的jar包,找到 安裝目錄下的product\11.2.0\dbhome_1\jdbc\lib 的odbc6.jar拷貝到工程的lib下

拷貝jar包

2.將jar包新增到依賴

選中工程-右鍵-open moudle settings

將jar包新增到依賴

第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查詢結果

獲取資料庫表資訊的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簡單的使用。

文件下載