博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis源码研究6:元数据(metadata)
阅读量:4921 次
发布时间:2019-06-11

本文共 4065 字,大约阅读时间需要 13 分钟。

原理分析之六:元数据(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://www.cnblogs.com/qitian1/archive/2012/12/05/6463915.html

你可能感兴趣的文章
HDU 1069 Monkey and Banana(DP)
查看>>
HDU 2577 How to Type(杭电300题纪念)
查看>>
TestNG中的DataProvider返回Iterator<Object[]>的妙用
查看>>
WebApi使用二进制方式上传和下载文件
查看>>
CS224n学习笔记(二)
查看>>
pymysql模块
查看>>
ThreadLocal
查看>>
安全需求-建模归类——By Me
查看>>
面向对象chapter7
查看>>
关于gcc、glibc和binutils模块之间的关系
查看>>
NB的新技术
查看>>
并查集
查看>>
centos 5.6 升级php到5.3
查看>>
Java两种延时——thread和timer
查看>>
让vim能完成代码提示~~
查看>>
【Android】java.lang.StackOverflowError: stack size 8MB
查看>>
12 个 CSS 高级技巧汇总
查看>>
Node.js 系列01
查看>>
源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
查看>>
Apache Jmeter(1)
查看>>