Mybatis源码研究6:元数据(metadata)
2019獨角獸企業重金招聘Python工程師標準>>>
原理分析之六:元數據(metadata)
? 一、依賴關系
? 本包對mybatis的其它包沒有任何依賴,mybatis的其它包也不依賴于本包,
? 即本包可以作為單獨的組件或者工具類提出來。
?
?
? 二、類功能概述
? 包含了3個元數據實體類和一個工廠類。
? Table是對表的簡單封裝,包括name,columns,primaryKey,catalog,schema。
?
? Column是對列的簡單封裝,包括name和type。
?
? Database是對數據庫的簡單封裝,包括catalog,schema,tables。
?
? DatabaseFactory用來創建Database對象。
?
? 三、類的方法和屬性
?
//數據庫-表格-列
public class Column {
?// 列名
?private String name;
?// 列的類型
?private int type;
?
//構造方法
//getter/setter方法
}
?
//數據庫-表格
public class Table {
?//表名
?private final String name;
?//類別名
?private String catalog;
?//模式名
?private String schema;
?//列的集合
?private final Map<String, Column> columns = new HashMap<String, Column>();
?//主鍵列
?private Column primaryKey;
?
//構造方法
//getter/setter方法
?
}
?
//數據庫
public class Database {
?// 類別名稱;它必須與存儲在數據庫中的類別名稱匹配;該參數為 "" 表示獲取沒有類別的那些描述;為 null 則表示該類別名稱不應該用于縮小搜索范圍
?private final String catalog;
?// schemaPattern - 模式名稱的模式;它必須與存儲在數據庫中的模式名稱匹配;該參數為 "" 表示獲取沒有模式的那些描述;為 null
?// 則表示該模式名稱不應該用于縮小搜索范圍
?private final String schema;
?// 表格的集合
?private final Map<String, Table> tables = new HashMap<String, Table>();
?
//構造方法
//getter/setter方法
?
}
? 本包除了3個實體類封裝了 屬性和數據結構,只有一個核心方法。
public class DatabaseFactory {
// 根據數據庫連接-類別-模式,生成Database對象。
?public static Database newDatabase(Connection conn, String catalogFilter,
???String schemaFilter) throws SQLException {
??Database database = new Database(catalogFilter, schemaFilter);
??ResultSet rs = null;
??try {
???// 數據庫元數據
???DatabaseMetaData dbmd = conn.getMetaData();
???try {
????rs = dbmd.getColumns(catalogFilter, schemaFilter, null, null);
????// 遍歷結果集,取出表的信息,構建Table對象,加入到Databse的Table集合中
????while (rs.next()) {
?????String catalogName = rs.getString("TABLE_CAT");
?????String schemaName = rs.getString("TABLE_SCHEM");
?????String tableName = rs.getString("TABLE_NAME");
?????String columnName = rs.getString("COLUMN_NAME");
?????int dataType = Integer.parseInt(rs.getString("DATA_TYPE"));
?????Table table = database.getTable(tableName);
?????if (table == null) {
??????table = new Table(tableName);
??????table.setCatalog(catalogName);
??????table.setSchema(schemaName);
??????database.addTable(table);
?????}
?????table.addColumn(new Column(columnName, dataType));
????}
???} finally {
????if (rs != null)
?????rs.close();
???}
???try {
????String[] tableNames = database.getTableNames();
????// 遍歷所有的Table,取出列名和主鍵信息
????for (int i = 0; i < tableNames.length; i++) {
?????Table table = database.getTable(tableNames[i]);
?????rs = dbmd.getPrimaryKeys(catalogFilter, schemaFilter,
???????table.getName());
?????if (rs.next()) {
??????String columnName = rs.getString("COLUMN_NAME");
??????table.setPrimaryKey(table.getColumn(columnName));
?????}
????}
???} finally {
????if (rs != null)
?????rs.close();
???}
??} finally {
???try {
????conn.rollback();
???} catch (Exception e) {
????/* ignore */
???}
??}
??return database;
?}
?
}
??
? 四、應用實例
public static void main(String[] args) throws ClassNotFoundException,?SQLException {
??Connection conn = getConnection();
??String catalogFilter = null;
??String schemaFilter = null;
??Database db = DatabaseFactory.newDatabase(conn, catalogFilter,
????schemaFilter);
??pn("catalog:" + db.getCatalog());
??pn("schema:" + db.getSchema());
??String[] tableNames = db.getTableNames();
??for (String name : tableNames) {
???Table table = db.getTable(name);
???p("catalog:"+table.getCatalog()+",");
???p("schema:"+table.getSchema()+",");
???String[] columnNames = table.getColumnNames();
???for (String columnName : columnNames) {
????Column column = table.getColumn(columnName);
????p(column.getName()+",");
????p(column.getType()+",");
???}
???pn("");
??}
??if (conn != null) {
???conn.close();
??}
?}
?// 簡化打印
?public static void pn(Object str) {
??System.out.println(str);
?}
?
?public static void p(Object str) {
??System.out.print(str);
?}
?// 獲取數據庫連接
?public static Connection getConnection() throws ClassNotFoundException,
???SQLException {
??String driver = "com.mysql.jdbc.Driver";
??String url = "jdbc:mysql://localhost:3306/mysql?userUnicode=true&characterEncoding=UTF8";
??String user = "root";
??String password = "123456";
??Class.forName(driver);
??return DriverManager.getConnection(url, user, password);
?}
?
打印結果:
catalog:null
schema:null
catalog:mysql,schema:null,Host,1,Table_name,1,Table_priv,1,Column_priv,1,Grantor,1,Db,1,Timestamp,93,User,1,
catalog:mysql,schema:null,Use_leap_seconds,1,Time_zone_id,4
......
轉載于:https://my.oschina.net/jiutianniao/blog/399648
總結
以上是生活随笔為你收集整理的Mybatis源码研究6:元数据(metadata)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xmpp 与服务器连接并身份验证成功
- 下一篇: 毕业设计之路(2)——初识TCP