您好,登錄后才能下訂單哦!
當(dāng)通過一個JDBC連接上一個數(shù)據(jù)的時候,我們就可以通過JDBC獲取到這個數(shù)據(jù)的各種信息,比如數(shù)據(jù)庫的名稱、模式、表結(jié)構(gòu)(及其字段)、視圖、函數(shù)、過程、訪問權(quán)限等等一系列的信息。當(dāng)然,如果你原意,你還可以訪問個個表中的數(shù)據(jù)(只要你有權(quán)限)。
筆者曾接觸Sybase數(shù)據(jù)庫,Sybase很垃圾,搞了老半天,連個表都看不見,更無從談及訪問數(shù)據(jù),無奈之下通過JDBC連接上數(shù)據(jù)庫后,將數(shù)據(jù)的各種信息一一輸出。
時隔兩年了,近日又在做一個項目的時候,發(fā)現(xiàn)很多人都用IDE從表生成POJO,各個工具生成規(guī)則也有所不同,一是SQL到Java類型之間的映射策略不一致。而是生成POJO屬性連個注釋都沒有,一大堆英文描述(實際上全是費屁,我僅僅要的是個字段的含義)。很低級吧,從表到POJO,一般來說都是從對象建模入手,快速分解問題,建立其領(lǐng)域模型(其中包含實體類之間聯(lián)系),如有必要才過渡到數(shù)據(jù)庫建模。當(dāng)然這些都是不是鄙人所能控制的。
既然要大家都要做這一步工作,為了保持映射關(guān)系的一致性,可以定義下Java SQL Type到Java Type之間的一個映射關(guān)系,然后讀取各個表名稱、遍歷其字段的名稱、類型、注釋等信息,并將表、字段的注釋信息拿來作為POJO成員變量的注釋信息,這就達(dá)到目的了,至于getter/setter方法,各個工具都生成的很好,就不用自己再浪費時間干哪些無聊的工作了。
下面以MySQL5為例,看看實現(xiàn)過程:
首先為了描述表和列的關(guān)系,必須做個簡單建模:
表對象、列對象,之間是一對多關(guān)系。
public class TableInfoBean {
private String tableName;
private String tableComment;
private List<ColumnBean> columnList=new ArrayList<ColumnBean>();
public class ColumnBean {
private String columnName;
private String columnComment;
private String SqlType;
這個關(guān)系很簡單,就這么搞定了,用來保存一個表信息。
下面就是如何從數(shù)據(jù)庫讀取表信息了。
在這里依賴一個類DatabaseMetaData,這個對象可以從數(shù)據(jù)庫連接來獲取。有了它萬事大吉了,想知道什么問它即可:
DatabaseMetaData databaseMetaData = conn.getMetaData();
//獲取所有表
ResultSet tableSet = databaseMetaData.getTables(null, "%", "%", new String[]{"TABLE"});
//獲取tableName表列信息
ResultSet columnSet = databaseMetaData.getColumns(null, "%", tableName, "%");
上面代碼會得到兩個結(jié)果集,對照DatabaseMetaData 的文檔,我們可以通過結(jié)果集的列名來獲取想要的信息,例如
String tableName = tableSet.getString("TABLE_NAME");
String tableComment = tableSet.getString("REMARKS");
String columnName = columnSet.getString("COLUMN_NAME");
String columnComment = columnSet.getString("REMARKS");
String sqlType = columnSet.getString("DATA_TYPE");
含義很清楚我就不做解釋了。
逐個遍歷表,然后得到一個TableInfoBean的集合,這個集合就是數(shù)據(jù)庫中所有表的信息了,有了這個信息,生成xml、POJO簡直就是小兒科的事情了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。