- 浏览: 200499 次
- 性别:
- 来自: 紫禁城
文章分类
最新评论
-
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 1125Ubuntu 下 JDK+Tomcat+MySql ... -
Eclipse下切换 SVN 中已经保存的用户名和密码
2009-09-22 10:28 17051. 把 C:\Documents and Set ... -
Java实现汉字转换为拼音
2006-10-31 13:15 595import java.util.HashMap;import ... -
Java中的克隆(Clone)机制
2007-08-03 09:03 615现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个 ... -
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
2008-12-16 10:32 713在多线程大师Doug Lea的贡献下,在JDK1.5中加入 ... -
Java读取Properties文件的六种方法
2009-04-16 09:34 707使用J2SE API读取Properties文件的六种方法 ... -
深入探讨java集合类
2006-08-24 20:47 695不同的集合在添加对象时的处理是不同的:Set:不允许重复,且没 ... -
递归在java语言中的应用
2006-08-25 09:21 1013一 . 两个小经验 1.在定义一个类时,不要随意定义成员变量 ... -
java类装载器
2006-08-25 18:36 840一 . 面向接口编程. 不要面向类编程. 二 . 关于异常:如 ... -
几个Java基础知识
2006-08-25 19:18 656一 . Hashtable和HashMap Hashtab ... -
面向方面的编程(AOP)
2006-08-25 19:33 710面向对象的编程(OOP)中 ... -
Collection与UML学习
2006-09-01 19:19 675一 . 属性<property>时须注意:1. & ... -
反射和代理
2006-09-01 19:23 692一. 关于数据库.当今的数据处理大致可以分成两大类:联机事务处 ... -
Jdk1.5的新语法和一些java学习的小知识点
2006-09-01 19:30 1199一.1. 操作系统执行具体 ... -
自己动手写数据库连接池
2006-10-07 22:28 1018在前面的文章中已经说过使用连接池的很多好处和优势,也曾讨论过怎 ... -
BASE64编码
2006-10-24 08:39 12981.HttpServletRequest: 请求 ... -
一个实现MD5的简洁的java类
2006-10-28 22:27 632一个实现MD5的简洁的java类 package test; ... -
使用Java将Word转为Html或txt!
2006-10-31 13:47 1203package org.client; // 使用Java将W ... -
理解接口
2006-11-01 14:12 524... -
正则表达式中问号等特殊字符的转义
2006-11-10 00:26 2463正则表达式中问号等特殊字符的转义 除 .$ ^ { [ ( | ...
相关推荐
DatabaseMetaData生成数据库DLL
DatabaseMetaData 接口DatabaseMetaData 接口作为整体提供有关数据库的综合信息。 其中某些方法采用“字符串”自变量作为目录和模式名称。DB2 Everyplace 忽略这些自变量。 此处的某些方法以 ResultSet 对象的...
DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文只讲解DatabaseMetaData接口获取元数据的方法。 文章地址:http://blog.csdn.net/chen_zw/article/details/18816599
下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
calibre-web 数据库文件metadata.db 下载
DatabaseMetaData 接口作为整体提供有关数据库的综合信息。
JTDS完全与JDBC 3.0兼容,支持只向前的,和可滚动/可更新的结果集(ResultSets)中并行(完全独立)语句,并且可实施所有databasemetadata和resultsetmetadata方法。 文件有说明spring+hibernate+c3p0+jtds的配置
10.1 使用不同的数据库和驱动程序 10.1.1 扩展的DBManager类 10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用...
Java获取数据库属性信息,使用DatabaseMetaData对象获取数据源相关信息。还可获取索引名、获取存储过程信息、获取存储过程列信息、输出存储过程列信息等。
10.1 使用不同的数据库和驱动程序 10.1.1 扩展的DBManager类 10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用...
10.1 使用不同的数据库和驱动程序 10.1.1 扩展的DBManager类 10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用...
10.1 使用不同的数据库和驱动程序 10.1.1 扩展的DBManager类 10.2 使用DatabaseMetaData 10.3 检索与数据库相关的信息 10.3.1 在JTree中显示DatabaseMetaData 10.4 检索有关RDBMS功能性的信息 10.5 使用...
Java连接数据库和断开数据库讲解 代码,研究JDBC连接SQLServer数据库,很简单但很实用的例子,从建立驱动连接到打开数据库的过程,欢迎学习参考。主要代码如下: Class.forName(...
Java使用JDBC创建和关闭数据库连接的方法附代码,学习和熟悉一下JDBC的用法,创建一个数据库连接,并关闭或断开这个连接,面向java初学者。Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载...
利用DatabaseMetaData接口提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS。 b.可在现有数据库上实现。 c.提供与其它Java系统一致的界面。这说明开发人员可以采用一致的编程界面来处理数据库编程。 d...
利用DatabaseMetaData接口提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS。 b.可在现有数据库上实现。 c.提供与其它Java系统一致的界面。这说明开发人员可以采用一致的编程界面来处理数据库编程。 d...
calibre 数据库,放在挂载的目录下面; 解决问题:DB location is not valid, please enter correct path
java读取metadata元信息
DatabaseMetaData metaData=conn.getMetaData(); int dataCount=metaData.getMaxConnections(); //writerLog("数据库最大连接数为:"+dataCount); if(dataCount>0&&maxCount>dataCount){ ...
ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...