文档章节

Mybatis源码研究6:元数据(metadata)

jtn
 jtn
发布于 2015/04/13 15:07
字数 787
阅读 20
收藏 0

原理分析之六:元数据(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

......

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
学习东西总结:

一.JAVA 基础 1、JAVA并发编程 2.JAVA NIO系列 3.JVM深入了解 4.JAVA性能优化相关研究 5.JAVA7,8新特性 二、数据库 1.数据库优化研究 2.MYSQL高可用性研究 3.MYSQL源码研究 三、网络 1.HTTP...

QH_C
2016/03/25
5
0
spring + mybatis + 多数据源整合事务

1、核心思想,spring提供了一个DataSource的子类,该类支持多个数据源 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 该类的源码如下: org.springframework.jdbc...

程序员小虫
2015/09/20
7.7K
1
微软将编译器通用基础结构开源了

【IT168 资讯】微软研究院已经将“Common Compiler Infrastructure: Metadata (CCI)”和“CCI: Code and AST”两个项目开源了,其中包含了一套让编译器或编程工具操作CLR程序集元数据和调试文...

IT168网站
2009/04/20
0
0
Mysql配置参数innodb_buffer_pool_size的学习与整理

原文地址:Mysql配置参数innodbbufferpoolsize的学习与整理 这半个月来,一直在做一些关于服务器交易端性能的提升工作,主要是分析和讨论交易端性能的瓶颈,找出导致性能减慢的原因,拟定出合...

Realfighter
2015/01/15
32.8K
1
《Nginx高性能Web服务器》系列分享专栏

《Nginx高性能Web服务器》系列分享专栏 [作者:Poechant] Nginx是目前最流行的基于BSD-like协议、轻量级、高性能的HTTP服务器、反向代理服务器和电子邮件(SMTP/POP3/IMAP)服务器。CSDN的Ngi...

开元中国2015
2018/12/01
96
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部