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)相关推荐

  1. Mybatis源码研究序

    公司开发项目中,用到了Mybatis这个框架.所以,开始了对Mybatis的认真学习-应用-研究. DbUtils,Mybatis,Struts2,Hibernate3,Spring3 的源码都瞧了瞧 ...

  2. Mybatis源码研究5:数据源的实现

    2019独角兽企业重金招聘Python工程师标准>>> 一.数据源概述 数据源相关核心类位于datasource包中,本包主要引用了Mybatis的reflection的Except ...

  3. Mybatis源码研究2:框架整体设计

    本文转载自:http://chenjc-it.iteye.com/blog/1460990 1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. ...

  4. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

  5. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

  6. Mybatis 源码探究 (3)创建 SqlSessionFactory对象 执行sqlSession.getMapper()方法

    Mybatis 源码探究 (3)创建 SqlSessionFactory对象 时隔许久,终于又能接着来搞他啦.Mybatis 一起来探究吧. 先笑会再进入主题吧 开始啦 一.new SqlSessio ...

  7. mybatis源码分析执行流程

    前言 在上一篇,我们了解了mybatis的整体执行流程,以及内部的各个组件在执行过程中的功能,下面我们来通过源码的方式对其中比较重要的几个组件在执行过程的使用进行简单的分析与说明 环境准备 基于第一篇 ...

  8. JAVA计算机毕业设计中华二十四节气文化传承宣展平台Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计中华二十四节气文化传承宣展平台Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计中华二十四节气文化传承宣展平台Mybatis+源码+数据库+lw文档+ ...

  9. java毕业设计能源控制系统mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计能源控制系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计能源控制系统mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S架构 开 ...

最新文章

  1. 给大家推荐一个.Net的混淆防反编译工具ConfuserEx
  2. 计算机二级find,Excel函数-find、if和iferror-计算机二级Office
  3. 《过早退出是一切失败的根源》读后感
  4. 多重响应交叉表点不动确定_风靡全球的尼克巨星登陆杭城!还有19.9元美食、多重惊喜好礼……嗨翻12月!...
  5. Illustrator 教程,如何在 Illustrator 中创建色板?
  6. k8s-有状态应用编排
  7. 在n1 ,魔百盒q5盒子上,实现惠普p1008系列的网络共享 打印和airprint服务
  8. Selenium GUI自动化下载百度图片
  9. RN 组件 Animated
  10. java键盘监听延迟_解决JAVA键盘监听的延迟现象以及八个方向的运动
  11. 精油商城小程序,让您的品牌更出彩!
  12. 关于常用(?)字符串处理函数的合集
  13. CGI的基本定义和优劣势是什么
  14. android java开发
  15. 敏捷开发-Scrum过程模型
  16. C# 打印照片和文档
  17. cssci和核心期刊的区别
  18. 2021周记12:理财、朋友与焦虑
  19. 中国人民公安大学(PPSUC)网络对抗技术作业
  20. Python爬虫实战:京东拍拍验机(帮你买到最完美的二手iPhone)

热门文章

  1. Mongodb 基础 查询表达式
  2. C. The Meaningless Game
  3. Atitit ftp原理与解决方案
  4. mysql海量数据存储
  5. Demo:充分利用 Ajax 技术 来体现页面局部刷新 效果(获取天气预报情况)
  6. Kotlin学习笔记(2)- 空安全
  7. 防止UI界面被输入法遮挡(画面随输入法自适应)
  8. FastJsonUtils 需要fastjson
  9. H.264编码profile level控制
  10. Plupload+easyui+springmvc实现批量上传