`
senton
  • 浏览: 205868 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

使用DatabaseMetaData和ResultSetMetaData查看数据库信息

    博客分类:
  • J2SE
阅读更多

/**DatabaseMetaData接口查看数据库的整体综合信息,它位于java.sql包中,
 * 由数据库驱动程序供应商提供,里面定义了很多关于此数据库的信息,例如版
 * 本号、此JDBC驱动程序的名称等等。ResultSetMetaData可用于获取关于
 * ResultSet 对象中列的类型和属性信息的对象,也位于java.sql包中。下面
 * 这个程序的主要功能是查看所有数据库、进入指定的数据库查看所有表、查看表
 * 的详细信息、以及使用select、update、insert、delete操作数据表信息等。
 * 因为效果图太多,这里我就不截图了,有兴趣的朋友可以在自己机上试试看。
 * 下面是实现的代码:
 */

/**
 * 静态导入System包,因为在下面用System.out.println()
 * 比较多,有此import语句就可以省略前面的System了。这是
 * jdk1.5的新语法,有兴趣的朋友可以看看java核心技术的第
 * 七版,所有的新语法都有介绍。
 */
import static java.lang.System.*;

/** 导入下面要用到的所有类 */
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Scanner;

public class Client {
 /**
  * 定义几个全局变量
  */
 private Connection con = null;

 private PreparedStatement pstmt = null;

 private ResultSet rs = null;

 private ResultSetMetaData rsmd = null;

 private String url = "";

 /**
  * 首先使用static块加载mysql的驱动,static块里面的代码在 Client类一加载就执行,且只执行一次
  */
 static {
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }

 /**
  * useMysql方法,功能是使用use命令进入参数指定的数据库
  *
  * @param dbName
  *            数据库名
  * @return void
  */
 public void useMysql(String dbName) {
  url = "jdbc:mysql://localhost:3306/" + dbName;
  try {
   con = DriverManager.getConnection(url, "usename", "password");
   out.println("数据库已改变!");
  } catch (Exception e) {
   out.println("Exception:" + e.getMessage());
  }
 }

 /**
  * execute 方法根据参数判断执行指定的命令
  *
  * @param prefix
  *            命令的第一个单词
  * @param sql
  *            要执行sql语句sql语句
  */
 public void execute(String prefix, String sql) {
  if (prefix.equals("use")) {
   useMysql(sql);
  } else if (prefix.equals("show")) {
   show(sql);
  } else if (prefix.equals("desc")) {
   desc(sql);
  } else if (prefix.equals("select")) {
   select(prefix + " " + sql);
  } else if (prefix.equals("update") || prefix.equals("insert")
    || prefix.equals("delete")) {
   update(prefix + " " + sql);
  } else {
   out.println("错误的命令!");
  }
 }

 /**
  * update方法 用于执行update、insert、delete命令
  *
  * @param sql
  *            要执行sql语句
  */
 private void update(String sql) {
  if (con == null) {
   out.println("请先使用use命令!");
  } else {
   try {
    pstmt = con.prepareStatement(sql);
    // 如果影响行数不为则说明sql语句执行成功
    if (pstmt.executeUpdate(sql) != 0) {
     out.println("执行成功!");
    }
   } catch (Exception e) {
    out.println(e.getMessage());
   }
  }
 }

 /**
  * select 方法,用于执行select语句。此方法写了大量的格式化语
  * 句。也使用到了jdk1.5的新语法。那就是System.out.printf()方法。
  *  使用方法和C语言差不多。
  * @param sql
  *            要执行sql语句
  */
 private void select(String sql) {
  if (con == null) {
   out.println("请先使用use命令!");
  } else {
   try {
    pstmt = con.prepareStatement(sql);
    rs = pstmt.executeQuery();
    rsmd = rs.getMetaData();

    int j = 15 * rsmd.getColumnCount() + rsmd.getColumnCount() - 1;

    out.print("+");
    for (int i = 0; i < j; i++)
     out.print("-");
    out.print("+\n");

    for (int i = 1; i <= rsmd.getColumnCount(); i++) {
     out.printf("|%-15s", rsmd.getColumnName(i));
    }
    out.print("|\n+");

    for (int i = 0; i < j; i++)
     out.print("-");
    out.print("+\n");

    // 表中数据的信息
    while (rs.next()) {
     for (int i = 1; i <= rsmd.getColumnCount(); i++) {
      out.printf("|%-15s", rs.getObject(i).toString());
     }
     out.println("|");
    }
    out.print("+");

    for (int i = 0; i < j; i++)
     out.print("-");
    out.print("+\n");
   } catch (Exception e) {
    out.println(e.getMessage());
   }
  }
 }

 /**
  * desc方法,用于查看指定表的具体信息,类似于mysql命令的desc语句的功能
  *
  * @param table
  *            指定的表名
  */
 private void desc(String table) {
  if (con == null) {
   out.println("请先使用use命令!");
  } else {
   try {
    pstmt = con.prepareStatement("select * from " + table);
    rs = pstmt.executeQuery();
    rsmd = rs.getMetaData();

    out.print("+");
    for (int i = 0; i < 68; i++)
     out.print("-");
    out.print("+\n");

    out.printf("|%-25s|%-15s|%-10s|%-15s|\n", "Field", "Type",
      "Null", "Extra");
    out.print("+");

    for (int i = 0; i < 68; i++)
     out.print("-");
    out.print("+\n");

    // 表的详细信息
    for (int i = 1; i <= rsmd.getColumnCount(); i++) {
     out.printf("|%-25s", rsmd.getColumnName(i));
     out.printf("|%-15s", rsmd.getColumnTypeName(i) + "("
       + rsmd.getColumnDisplaySize(i) + ")");
     out.printf("|%-10s", ((rsmd.isNullable(i) == 1) ? "YES"
       : "NO"));
     out.printf("|%-15s|\n",
       rsmd.isAutoIncrement(i) ? "auto_increment" : "");
    }
    out.print("+");

    for (int i = 0; i < 68; i++)
     out.print("-");
    out.print("+\n");

   } catch (Exception e) {
    out.println(e.getMessage());
   }
  }
 }

 /**
  * show 方法,根据用户输入的信息判断是show tables 还是show databases 再进行处理
  *
  * @param obj
  *            要查看的对象
  */
 private void show(String obj) {
  if (obj.equals("tables")) {
   if (con == null) {
    out.println("请先使用use命令!");
   } else {
    try {
     DatabaseMetaData dsmd = con.getMetaData();
     rs = dsmd.getTables(null, null, null, null);

     out.print("+");
     for (int i = 0; i < 78; i++)
      out.print("-");
     out.print("+\n");

     out.printf("|%-27s|%-12s|%-12s|%-12s|", "表名称", "表类别",
       "表类型", "表模式");
     out.println();
     out.print("+");

     for (int i = 0; i < 78; i++)
      out.print("-");
     out.print("+");
     out.println();

     while (rs.next()) {
      out.printf("|%-30s|%-15s|%-15s|%-15s|", rs
        .getString("TABLE_NAME"), rs
        .getString("TABLE_CAT"), rs
        .getString("TABLE_TYPE"), rs
        .getString("TABLE_SCHEM"));
      out.println();
     }

     out.print("+");
     for (int i = 0; i < 78; i++)
      out.print("-");
     out.print("+");
     out.println();
    } catch (Exception e) {
     out.println(e.getMessage());
    }
   }
  } else if (obj.equals("databases")) {
   try {
    con = DriverManager.getConnection("jdbc:mysql:///", "usename",
      "password");
    DatabaseMetaData dsmd = con.getMetaData();
    rs = dsmd.getCatalogs();

    out.print("+");
    for (int i = 0; i < 30; i++)
     out.print("-");
    out.print("+");

    out.println();
    out.printf("|%-30s|\n", "DATABASE");

    out.print("+");
    for (int i = 0; i < 30; i++)
     out.print("-");
    out.print("+");

    out.println();
    while (rs.next()) {
     out.printf("|%-30s|\n", rs.getString(1));
    }

    out.print("+");
    for (int i = 0; i < 30; i++)
     out.print("-");
    out.print("+");
    out.println();
   } catch (Exception e) {
    out.println(e.getMessage());
   }
  } else {
   out.println("错误的命令!");
  }
 }

 public static void main(String[] args) {
  /**
   * Scanner也是jdk1.5新加进来的一个类,在java.util
   * 包中,具体用法可以查看jdk1.5的API,这里是从键盘获
   * 得一个输入流,比用BufferedReader简单的多了。
   */
  Scanner scanner = new Scanner(System.in);
  Client client = new Client();
  out.println("查看所有数据库使用show databases命令");
  out.println("进入数据库使用use命令(use databaseName)");
  out.println("查看数据库表信息使用show tables命令");
  out.println("显示表信息使用desc命令(desc tableName)");
  out.println("执行sql命令使用select,update,delete");
  out.println("退出请使用 quit ");
  String command = "";
  while (true) {
   try {
    out.print("mysql> ");
    command = scanner.nextLine();
    //判断输入的命令是否为quit或者QUIT,是则跳出循环,退出程序
    if (command.trim().equals("quit")
      || command.trim().equals("QUIT")) {
     break;
    }
    //使用正则表达式去掉输入字符串的前后空格后再把中间所有超过一
    //个空格的地方转换为一个空格
    command = command.trim().replaceAll(" +", " ");
    //经过上面处理后取到命令的第一个关键字
    String prefix = command.substring(0, command.indexOf(" "));
    String sql = command.substring(command.indexOf(" ") + 1);
    client.execute(prefix, sql);
   } catch (Exception e) {
    out.println(e.getMessage());
   }
  }
 }

分享到:
评论

相关推荐

    JDBC元数据操作--DatabaseMetaData接口Demo

    DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。 文章地址:http://blog.csdn.net/chen_zw/article/details/18816599

    JAVA连接数据库进行相应的操作

    以及获取和修改数据使用JDBC加载驱动程序、连接数据库、执行SQL语句和处理结果集使用处理预编译语句的接口PreparedStatement执行带参数的动态SQL语句利用CallableStatement接口执行SQL的存储过程使用Database...

    jsp数据库脱裤脚本,脱各种数据库

    7. 使用DatabaseMetaData对象可以获取数据库的元数据,例如表名、列名等。 8. 使用ResultSet对象可以获取查询结果,例如执行SHOW CREATE TABLE语句可以获取表结构。 9. 使用Statement对象可以执行SQL语句,例如...

    java对数据库操作常用对象及方法整合[归类].pdf

    Java 语言中经常使用的数据库操作对象和方法整合,主要包括 DatabaseMetaData、ResultSet、ResultSetMetaData 等对象。 DatabaseMetaData 对象 DatabaseMetaData 对象提供了关于整个数据库的信息,包括表名、表的...

    Java数据库编程宝典4

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典3

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java数据库编程宝典2

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    JDBC与Java数据库程序设计

    - `DatabaseMetaData`提供关于数据库的信息,如版本、表、列等。 10. **错误处理与异常** - JDBC的异常处理通常涉及`SQLException`及其子类,确保正确捕获并处理数据库操作中的错误。 以上内容构成了"JDBC与Java...

    Java数据库编程宝典1

    10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...

    Java Web程序设计-1期 项目库_单元案例_数据库元数据操作和分页教学案例.doc

    本案例主要讲解如何使用Java的`DatabaseMetaData`类来获取数据库的元数据,并展示了一个简单的分页实现。 首先,`DatabaseMetaData`是Java SQL API的一部分,它是通过数据库连接对象`Connection`获取的。在案例中,...

    Java程序设计:chapter14 JDBC技术和数据库开发应用.ppt

    - `DatabaseMetaData`接口:提供关于数据库的元数据,如数据库版本、表信息、列信息等。 在实际应用中,使用JDBC通常涉及以下步骤: 1. 加载数据库驱动。 2. 建立到数据库的连接。 3. 创建`Statement`或`...

    java各种JDBC数据库驱动文件

    包括CallableStatement用于调用存储过程,ResultSetMetaData获取列信息,DatabaseMetaData获取数据库元数据,以及RowSet接口的离线数据处理能力。 9. **JDBC与ORM框架的关系** ORM(Object-Relational Mapping)...

    数据库访问的编程技术

    - **DatabaseMetaData**:获取关于数据库的信息,如表结构、支持的数据类型等。 **JDBC访问数据库的应用模型** JDBC访问数据库的应用模型主要有两种: 1. **两层模型**:客户端直接与数据库通信,适用于小型系统,...

    JDBC API数据库编程实作教材

    - DatabaseMetaData:提供关于数据库的信息,如表、列、视图等。 8. **案例实践** 本教材会提供实际的数据库操作示例,包括用户注册、登录、商品查询等功能,通过这些案例深入理解JDBC API的使用。 通过学习和...

    数据库操作实验报告1

    DatabaseMetaData 可以获取元数据。ResulteMetaData 可以获取元数据。 三、对于任意指定表可自动产生相应的类的程序 数据库是固定的,就先建立链接,sql 选择不同的表,然后提取表的 metadata 元数据即可建立对应...

    JDBC-用元数据将结果集封装为List对象[归类].pdf

    它可能包含了一个或多个方法,利用`DatabaseMetaData`和`ResultSetMetaData`来获取并展示数据库或结果集的元信息。 总结来说,JDBC中的元数据功能对于数据库操作非常重要,它们帮助开发者了解数据库的特性和结果集...

    java数据库连接jdbc介绍

    除此之外,还有其他辅助类和接口,如`DatabaseMetaData`用于获取数据库元数据,`Savepoint`用于设置保存点,`ResultSetMetaData`用于获取结果集的列信息等。 JDBC使得Java应用程序能够通过标准接口与任何支持JDBC的...

    Java 语言程序设计:第10章JDBC与数据库访问.ppt

    JDBC提供了丰富的接口和类,如CallableStatement用于调用存储过程,DatabaseMetaData用于获取数据库元数据,以及ResultSetMetaData用于获取结果集的列信息。通过熟练掌握JDBC,开发者可以高效地进行数据库操作,实现...

Global site tag (gtag.js) - Google Analytics