设为首页 收藏本站
查看: 1575|回复: 0

[经验分享] Mybatis源码研究6:元数据(metadata)

[复制链接]

尚未签到

发表于 2016-11-27 09:00:01 | 显示全部楼层 |阅读模式
  原理分析之六:元数据(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);
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
  ......

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306006-1-1.html 上篇帖子: Spring集成MyBatis进行项目开发(三) 下篇帖子: 深入浅出Mybatis-改造Cache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表