`
senton
  • 浏览: 205786 次
  • 性别: 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());
   }
  }
 }

分享到:
评论

相关推荐

    【java毕业设计】新冠疫情下的校园出入系统源码(ssm+mysql+说明文档+LW).zip

    功能说明: 本系统主要包括以下功能模块:个人中心,通知公告管理,用户管理,工作人员管理,进门登记管理,出门登记管理,出入统计管理,外来登记管理等模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    param-1.5.1-cp34-cp34m-win_amd64.whl.rar

    PartSegCore_compiled_backend-0.12.0a0-cp36-cp36m-win_amd64.whl.rar

    yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip

    yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip

    pgmagick-0.7.5-cp37-cp37m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    中国省级与地级市财政转移支付数据-最新.zip

    中国省级与地级市财政转移支付数据-最新.zip

    OPENCV 常用XML 内涵17个常用XML,包括人脸检测,微笑检测,人眼检测,用于学习模型训练和使用

    OPENCV 常用XML 内涵17个常用XML,包括人脸检测,微笑检测,人眼检测,用于学习模型训练和使用

    polylearn-0.1.dev0-cp27-cp27m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    postgresadapter-2.0.1-cp36-cp36m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    Polygon2-2.0.8-cp27-cp27m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    基于SSM的医院管理系统的设计与实现

    开发语言:Java 框架:SSM JDK版本:JDK1.8 服务器:tomcat8.5 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 浏览器:谷歌浏览器

    yolo算法-扑克牌数据集-1285张图像带标签.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    中国各省GDP及农业主要指标数据集(1999-2019).zip

    中国各省GDP及农业主要指标数据集(1999-2019).zip

    【java毕业设计】大学生校园图书角管理系统源码(ssm+mysql+说明文档+LW).zip

    功能说明: 系统主要包括系统主页、个人中心、用户管理、图书信息管理、图书分类管理、图书购买管理、图书借阅管理、图书续借管理、图书归还管理、留言板管理、系统管理等功能模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    2023-04-06-项目笔记 - 第三百二十阶段 - 4.4.2.318全局变量的作用域-318 -2025.11.17

    2023-04-06-项目笔记-第三百二十阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.318局变量的作用域_318- 2024-11-17

    Saturn-PCB-Toolkit-V7.00(土星PCB计算器)

    Saturn_PCB_Toolkit_V7.00_ 是一款功能强大的PCB参数计算工具,本人PCB设计15年一直使用的这款计算器,利用其给出的设计数据(如线距、线宽线厚),布出的PCB实际使用未曾出现过问题 以下是其主要功能特点: 1. **过孔特性计算**:能够计算过孔的寄生电容、寄生电感、过孔阻抗、过孔直流电阻、共振频率、阶跃响应、功耗等参数。 2. **导线载流能力计算**:可以计算不同线宽下的载流能力,根据环境温度和温升条件,提供不同条件下的载流值。 3. **串扰计算**:计算两相互耦合信号线间的串扰,这对于高速PCB设计尤为重要。 4. **波长计算**:提供波长的计算功能,这对于射频和高速数字PCB设计非常关键。 5. **导体阻抗计算**:计算导体的阻抗,这对于阻抗匹配和信号完整性至关重要。 6. **单位换算**:提供单位换算功能,方便不同单位制之间的转换。 7. **差分对计算**:针对差分信号的计算,这对于高速数据传输和降低噪声非常重要。

    yolo算法-车内乘客识别器数据集-1035张图像带标签-乘客.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    最新整理-中国各、省、市、县、乡镇基尼系数数据(到2023年)

    ## 一、数据介绍 数据名称:中国各、省、市、县、乡镇基尼系数数据 数据年份:1992-2023年 样本数量:92064条 数据格式:面板数据 ## 二、指标说明 共计10个指标:年份、省、省代码、市、市代码、县、县代码、乡镇、乡镇代码、夜间灯光基尼系数 ## 三、数据文件 中国各乡镇基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各区县基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各城市基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各省份基尼系数(基于夜间灯光数据)2000-2023年.dta

    【java毕业设计】学业帮扶管理系统源码(ssm+mysql+说明文档).zip

    环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    【java毕业设计】毕业生生活用品出售网站系统源码(ssm+mysql+说明文档+LW).zip

    功能说明: 系统主要包括管理员,商家和用户三大模块 (a) 管理员;管理员进入系统主要功能包括个人中心,用户管理,商家管理,用品分类管理,用品信息管理,系统管理,订单管理等功能并进行操作。 (b) 商家;商家进入系统主要功能包括个人中心,用品信息管理,订单管理等功能并进行操作。 (c) 用户;用户进入系统主要功能包括个人中心,我的收藏管理等功能并进行操作。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    最新行政区划、乡镇级矢量地图及2022年道路、水系、建筑轮廓数据(shp格式)-已更至最新.zip

    最新行政区划、乡镇级矢量地图及2022年道路、水系、建筑轮廓数据(shp格式)-已更至最新.zip

Global site tag (gtag.js) - Google Analytics