現在企業級WEB應用中與數據庫交互的XML文件都是通過插件自動生成的,不過有些時候修改比較老的項目的時候也是需要手動的來做這一動作的!如下代碼就是一個實現上述的功能的輔助類,在此記錄一下以備后用!
package com.cn.common.utils;import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import oracle.jdbc.OracleConnection;/*** 這個類主要用于手動的輔助寫與數據庫交互的XML文件,打印一些固定格式的信息,用于寫增刪改查的數據庫SQL語句* @author Administrator**/ public class MetaDataTest {/*** 主方法,獲得表的結構信息* @param args*/public static void main(String[] args){try {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "THE URL";String username="THE USERNAME";String password="THE PASSWORD";try {Properties props =new Properties();props.put("remarksReporting","true");/** 獲得數據庫連接,通過URL/USERNAME/PASSWORD,注意,要確定數據的服務是開啟的*/Connection conn = DriverManager.getConnection(url,username,password);/** 設置連接屬性,使得可獲取到列的REMARK(備注)*/((OracleConnection)conn).setRemarksReporting(true); DatabaseMetaData dmd = conn.getMetaData();System.out.println("=============================================The database infor======================================================"); // 數據庫名:System.out.println("數據庫名稱:" + dmd.getDatabaseProductName());// 數據庫版本號:System.out.println("數據庫版本號 :"+ dmd.getDatabaseProductVersion());// 驅動程序System.out.println("數據庫驅動程序 :" + dmd.getDriverName());// 驅動版本System.out.println("數據庫驅動版本:" + dmd.getDriverVersion()); System.out.println("=============================================The users infor========================================================="); //打印當前數據庫的所有用戶名稱 getAllSchemas(dmd); System.out.println("=============================================The tables infor========================================================"); //打印當前數據庫用戶下的所有表信息getAllTableList(dmd,"THE SCHEMA"); System.out.println("=============================================The table infor========================================================="); //打印當前用戶當前表結構信息getTableColumns(dmd,"THE SCHEMA","THE TABLE");} catch (SQLException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 獲得表或視圖中的列信息*/ public static void getTableColumns(DatabaseMetaData dbMetaData,String schemaName, String tableName){ try{ ResultSet rs = dbMetaData.getColumns(null, schemaName, tableName, "%"); while (rs.next()){ String tableCat = rs.getString("TABLE_CAT");//表目錄(可能為空) String tableSchemaName = rs.getString("TABLE_SCHEM");//表的架構(可能為空) String tableName_ = rs.getString("TABLE_NAME");//表名 String columnName = rs.getString("COLUMN_NAME");//列名 int dataType = rs.getInt("DATA_TYPE"); //對應的java.sql.Types類型 String dataTypeName = rs.getString("TYPE_NAME");//java.sql.Types類型名稱 int columnSize = rs.getInt("COLUMN_SIZE");//列大小int decimalDigits = rs.getInt("DECIMAL_DIGITS");//小數位數 int numPrecRadix = rs.getInt("NUM_PREC_RADIX");//基數(通常是10進制的) int nullAble = rs.getInt("NULLABLE");//是否允許為null String remarks = rs.getString("REMARKS");//列描述String columnDef = rs.getString("COLUMN_DEF");//默認int sqlDataType = rs.getInt("SQL_DATA_TYPE");//sql數據類型 int sqlDatetimeSub = rs.getInt("SQL_DATETIME_SUB"); //SQL日期時間 int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH"); //char類型的列中的字節長度int ordinalPosition = rs.getInt("ORDINAL_POSITION"); //表中列的索引(從1開始)String propName = colNameToPropName(columnName); System.out.println("=============================================The bean property infor================================================="); System.out.println("private String " + propName+";"); System.out.println("=============================================The column map infor===================================================="); System.out.println("<result column=\""+columnName+"\" property=\""+propName+"\" jdbcType=\"NVARCHAR\" />"); System.out.println("=============================================The input property infor==================================================");System.out.println("#"+propName+"#,"); System.out.println("=============================================The map property infor===============================================");System.out.println(columnName+"=#"+propName+"#,"); System.out.println("=============================================The bean property remarks infor=========================================");System.out.println("<tbl:th width=\"80\" delim=\"true\" field=\""+propName+"\">"+remarks+"</tbl:th>"); System.out.println("=============================================The property map infor==================================================");System.out.println("<tbl:td delim=\"true\">${element."+propName+"}</tbl:td>");/** * ISO規則用來確定某一列的為空性 * YES--如果該參數可以包括空值* NO--如果參數不能包含空值* 空字符串---如果參數為空性是未知的*/ String isNullAble = rs.getString("IS_NULLABLE"); /** * 指示此列是否是自動增長的* 1--如果該列是自動的* 2--如果不是自動遞增的* 空字符串--如果不能確定它是否是自動增長的* 列是自動遞增的參數是未知的*/ // String isAutoincrement = rs.getString("IS_AUTOINCREMENT"); System.out.println("=============================================The column map infor====================================================="); System.out.println(tableCat + "-" + tableSchemaName + "-" + tableName_ + "-" + columnName + "-" + dataType + "-" + dataTypeName + "-" + columnSize + "-" + decimalDigits + "-" + numPrecRadix + "-" + nullAble + "-" + remarks + "-" + columnDef + "-" + sqlDataType + "-" + sqlDatetimeSub + charOctetLength + "-" + ordinalPosition + "-" + isNullAble + "-" +""); } } catch (SQLException e){ e.printStackTrace(); } } /** * 獲得數據庫中所有用戶名稱 * @param dbMetaData */ public static void getAllSchemas(DatabaseMetaData dbMetaData){ try{ ResultSet rs = dbMetaData.getSchemas(); while (rs.next()){ String tableSchem = rs.getString("TABLE_SCHEM"); System.out.println(tableSchem); } } catch (SQLException e){ e.printStackTrace(); } } /** * 獲得指定用戶下面的表信息數據*/ public static void getAllTableList(DatabaseMetaData dbMetaData,String schemaName) { try { /** table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM". */String[] types = { "TABLE" }; ResultSet rs = dbMetaData.getTables(null, schemaName, "%", types); while (rs.next()) { String tableName = rs.getString("TABLE_NAME"); //表名稱 String tableType = rs.getString("TABLE_TYPE"); //表類型String remarks = rs.getString("REMARKS"); //表備注System.out.println(tableName + "-" + tableType + "-" + remarks); } } catch (SQLException e) { e.printStackTrace(); } }/*** 將數據庫表中的列名轉換成JavaBean的屬性名稱,轉換規則是采用駝峰式的命名規則* @param columnName* @return*/private static String colNameToPropName(String columnName){String result="";String name = columnName.toLowerCase();String[] data = name.split("_");for(int i=0;i<data.length;i++){if(i==0){result = data[i];}else{result += data[i].replaceFirst(data[i].substring(0, 1), data[i].substring(0, 1).toUpperCase());}}return result;} }
說明
1:此小程序可直接使用,只要拿到對應的項目中或者新建一個小項目就可以啦,當然需要引入ORACLE的JAR包
2:根據自己的需要連接對應的數據庫,并且需要指明那個用戶下的那一張表,程序中紅色字體部分已經明確指明啦!
3:打印對應的信息的時候,可自行選擇打印的部分(建議,循環部分的信息,一類一類的打印這樣更好處理)