- 浏览: 206679 次
- 性别:
- 来自: 紫禁城
文章分类
最新评论
-
a1439226817:
<!doctype html><html l ...
发布一个支持N级下拉列表联动的控件 -
a1439226817:
也不高个测试的demo,别人怎么用啊
发布一个支持N级下拉列表联动的控件 -
davaidgao:
不全啊,这是
Spring3.x权威开发指南 -
caizi12:
对于map绑定很是不方便,现在的做法,需要创建一User类,再 ...
浅谈 SpringMVC 数据绑定 -
joeyhuang:
不全啊..
Spring3.x权威开发指南
/**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());
}
}
}
}
发表评论
-
Ubuntu下JDK+Tomcat+MySql环境的搭建
2011-06-15 14:48 1168Ubuntu 下 JDK+Tomcat+MySql ... -
Eclipse下切换 SVN 中已经保存的用户名和密码
2009-09-22 10:28 17391. 把 C:\Documents and Set ... -
Java实现汉字转换为拼音
2006-10-31 13:15 621import java.util.HashMap;import ... -
Java中的克隆(Clone)机制
2007-08-03 09:03 642现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个 ... -
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
2008-12-16 10:32 742在多线程大师Doug Lea的贡献下,在JDK1.5中加入 ... -
Java读取Properties文件的六种方法
2009-04-16 09:34 740使用J2SE API读取Properties文件的六种方法 ... -
深入探讨java集合类
2006-08-24 20:47 731不同的集合在添加对象时的处理是不同的:Set:不允许重复,且没 ... -
递归在java语言中的应用
2006-08-25 09:21 1039一 . 两个小经验 1.在定义一个类时,不要随意定义成员变量 ... -
java类装载器
2006-08-25 18:36 871一 . 面向接口编程. 不要面向类编程. 二 . 关于异常:如 ... -
几个Java基础知识
2006-08-25 19:18 684一 . Hashtable和HashMap Hashtab ... -
面向方面的编程(AOP)
2006-08-25 19:33 747面向对象的编程(OOP)中 ... -
Collection与UML学习
2006-09-01 19:19 708一 . 属性<property>时须注意:1. & ... -
反射和代理
2006-09-01 19:23 716一. 关于数据库.当今的数据处理大致可以分成两大类:联机事务处 ... -
Jdk1.5的新语法和一些java学习的小知识点
2006-09-01 19:30 1232一.1. 操作系统执行具体 ... -
自己动手写数据库连接池
2006-10-07 22:28 1050在前面的文章中已经说过使用连接池的很多好处和优势,也曾讨论过怎 ... -
BASE64编码
2006-10-24 08:39 13271.HttpServletRequest: 请求 ... -
一个实现MD5的简洁的java类
2006-10-28 22:27 665一个实现MD5的简洁的java类 package test; ... -
使用Java将Word转为Html或txt!
2006-10-31 13:47 1234package org.client; // 使用Java将W ... -
理解接口
2006-11-01 14:12 554... -
正则表达式中问号等特殊字符的转义
2006-11-10 00:26 2496正则表达式中问号等特殊字符的转义 除 .$ ^ { [ ( | ...
相关推荐
DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。 文章地址:http://blog.csdn.net/chen_zw/article/details/18816599
以及获取和修改数据使用JDBC加载驱动程序、连接数据库、执行SQL语句和处理结果集使用处理预编译语句的接口PreparedStatement执行带参数的动态SQL语句利用CallableStatement接口执行SQL的存储过程使用Database...
7. 使用DatabaseMetaData对象可以获取数据库的元数据,例如表名、列名等。 8. 使用ResultSet对象可以获取查询结果,例如执行SHOW CREATE TABLE语句可以获取表结构。 9. 使用Statement对象可以执行SQL语句,例如...
Java 语言中经常使用的数据库操作对象和方法整合,主要包括 DatabaseMetaData、ResultSet、ResultSetMetaData 等对象。 DatabaseMetaData 对象 DatabaseMetaData 对象提供了关于整个数据库的信息,包括表名、表的...
10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...
10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...
10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...
- `DatabaseMetaData`提供关于数据库的信息,如版本、表、列等。 10. **错误处理与异常** - JDBC的异常处理通常涉及`SQLException`及其子类,确保正确捕获并处理数据库操作中的错误。 以上内容构成了"JDBC与Java...
10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用ResultSetMetaData 10.6 小结 第3部分 三层Web站点与JDBC 第11...
本案例主要讲解如何使用Java的`DatabaseMetaData`类来获取数据库的元数据,并展示了一个简单的分页实现。 首先,`DatabaseMetaData`是Java SQL API的一部分,它是通过数据库连接对象`Connection`获取的。在案例中,...
- `DatabaseMetaData`接口:提供关于数据库的元数据,如数据库版本、表信息、列信息等。 在实际应用中,使用JDBC通常涉及以下步骤: 1. 加载数据库驱动。 2. 建立到数据库的连接。 3. 创建`Statement`或`...
包括CallableStatement用于调用存储过程,ResultSetMetaData获取列信息,DatabaseMetaData获取数据库元数据,以及RowSet接口的离线数据处理能力。 9. **JDBC与ORM框架的关系** ORM(Object-Relational Mapping)...
- **DatabaseMetaData**:获取关于数据库的信息,如表结构、支持的数据类型等。 **JDBC访问数据库的应用模型** JDBC访问数据库的应用模型主要有两种: 1. **两层模型**:客户端直接与数据库通信,适用于小型系统,...
- DatabaseMetaData:提供关于数据库的信息,如表、列、视图等。 8. **案例实践** 本教材会提供实际的数据库操作示例,包括用户注册、登录、商品查询等功能,通过这些案例深入理解JDBC API的使用。 通过学习和...
DatabaseMetaData 可以获取元数据。ResulteMetaData 可以获取元数据。 三、对于任意指定表可自动产生相应的类的程序 数据库是固定的,就先建立链接,sql 选择不同的表,然后提取表的 metadata 元数据即可建立对应...
它可能包含了一个或多个方法,利用`DatabaseMetaData`和`ResultSetMetaData`来获取并展示数据库或结果集的元信息。 总结来说,JDBC中的元数据功能对于数据库操作非常重要,它们帮助开发者了解数据库的特性和结果集...
除此之外,还有其他辅助类和接口,如`DatabaseMetaData`用于获取数据库元数据,`Savepoint`用于设置保存点,`ResultSetMetaData`用于获取结果集的列信息等。 JDBC使得Java应用程序能够通过标准接口与任何支持JDBC的...
JDBC提供了丰富的接口和类,如CallableStatement用于调用存储过程,DatabaseMetaData用于获取数据库元数据,以及ResultSetMetaData用于获取结果集的列信息。通过熟练掌握JDBC,开发者可以高效地进行数据库操作,实现...