利用DatabaseMetaData得到数据库中所有表的信息,利用ResultSetMetaData获取表的结构,并和表中的数据一起输出到客户端.

1, 编写GetDBInfoServlet.java

package cn.apache.pl;

import java.io.*;

import java.sql.*;

import java.util.ArrayList;

import javax.servlet.*;

import javax.servlet.http.*;

public class GetDBInfoServlet extends HttpServlet

{

private String url;

private String user;

private String password;

public void init() throws ServletException

{

ServletContext sc = getServletContext();

String driverClass  = sc.getInitParameter("driverClass");

url = sc.getInitParameter("url");

user = sc.getInitParameter("user");

password = sc.getInitParameter("password");

try

{

Class.forName(driverClass);

}catch(ClassNotFoundException ce)

{

throw new UnavailableException("数据库驱动加载失败");

}

}

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws IOException, ServletException

{

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try

{

conn = DriverManager.getConnection(url, user, password);

resp.setContentType("text/html; charset=gb2312");

PrintWriter out = resp.getWriter();

out.println("<html><head>");

out.println("<title>数据库表的信息</title>");

out.println("</head><body>");

//调用请求对象的getParameter()方法得到查询的表名

String tableName = req.getParameter("tableName");

//如果表名为空,则执行if块内的代码

if(null == tableName || tableName.equals(""))

{

//调用连接对象的getMetaData()方法得到DatabaseMetaData对象

DatabaseMetaData dbMeta = conn.getMetaData();

/*

*调用DatabaseMetaData对象的getTables()得到,传递"TABLE"参数

*(代码中使用new String[]{"TABLE"})获取数据库中所有表的信息,

*返回一个结果集对象

*还可以传递"VIEW",获取数据库中视图的信息

*/

rs = dbMeta.getTables(null, null, null, new String[]{"TABLE"});

//输出一个表单

out.println("<form action=\"getdbinfo\" method=\"get\">");

//表单中有一个列表框

out.println("<select size=1 name=tableName>");

while(rs.next())

{

//调用getString("TABLE_NAME")得到表的名字

out.println("<option value="+rs.getString("TABLE_NAME")+">");

out.println(rs.getString("TABLE_NAME"));

out.println("</option>");

}

out.println("</select><p>");

out.println("<input type=\"submit\" value=\"提交\">");

out.println("</form>");

}

//如果用户提交了表名参数,则执行else块

else

{

stmt = conn.createStatement();

//查询表中所有字段,返回结果集

rs = stmt.executeQuery("select * from "+tableName);

//调用ResultSet对象的getMetaData()方法ResultSetMetaData对象

ResultSetMetaData rsMeta = rs.getMetaData();

//调用ResultSetMetaData对象的getColumnCount()方法得到结果集中列的总数

int columnCount = rsMeta.getColumnCount();

//以表格形式输出表的结构

out.println("<table border=1>");

out.println("<caption>表的结构</caption>");

out.println("<tr><th>字段名</th><th>字段类型</th><th>最大字符宽度</th></tr>");

//构造一个ArrayList集合对象,用于存储表中字段的名字

ArrayList<String> al = new ArrayList<String>();

for(int i=1; i<=columnCount; i++)

{

out.println("<tr>");

//调用ResultSetMetaData对象的getColumnName()方法得到列的名字

String columnName = rsMeta.getColumnName(i);

out.println("<td>"+columnName+"</td>");

//将列的名字保存到ArrayList集合中

al.add(columnName);

/*

*调用ResultSetMetaData对象的getColumnTypeName()方法得到列的

*数据库特定的类型名 和 列的最大字符宽度

*/

out.println("<td>"+rsMeta.getColumnTypeName(i)+"</td>");

out.println("<td>"+rsMeta.getColumnDisplaySize(i)+"</td>");

}

out.println("</table><p>");

//以表格形式输出表中的数据

out.println("<table border=1>");

out.println("<caption>表中的数据</caption>");

out.println("<tr>");

//通过for循环取出存储在ArrayList集合中的列名,作为表格的表头

for(int i=0; i<columnCount; i++)

{

out.println("<th>"+al.get(i)+"</th>");

}

while(rs.next())

{

out.println("<tr>");

for(int i=1; i<=columnCount; i++)

{

out.println("<td>"+rs.getString(i)+"</td>");

}

out.println("</tr>");

}

out.println("</table>");

}

out.println("</body></html>");

out.close();

}catch(SQLException se)

{

se.printStackTrace();

}finally

{

if(rs != null)

{

try

{

rs.close();

}catch(SQLException se)

{

se.printStackTrace();

}

rs = null;

}

if(stmt != null)

{

try

{

stmt.close();

}catch(SQLException se)

{

se.printStackTrace();

}

stmt = null;

}

if(conn != null)

{

try

{

conn.close();

}catch(SQLException se)

{

se.printStackTrace();

}

conn = null;

}

}

}

}

2,部署Servlet:

<!-- GetDBInfoServlet.java -->

<servlet>

<servlet-name>GetDBInfoServlet</servlet-name>

<servlet-class>cn.apache.pl.GetDBInfoServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>GetDBInfoServlet</servlet-name>

<url-pattern>/getdbinfo</url-pattern>

</servlet-mapping>

3,运行GetDBInfoServlet

启动Tomact服务器,在浏览器中打开: http://localhost:8080/ch08/getdbinfo

选择account表后,点”提交”,打开

表的结构

字段名

字段类型

最大字符宽度

userid

VARCHAR

20

balance

FLOAT

6

表中的数据

userid

balance

彭磊

500.00

徐璐

1000.50

再选”bookinfo”, 点”提交”,打开

表的结构

字段名

字段类型

最大字符宽度

id

INTEGER

11

title

VARCHAR

100

author

VARCHAR

100

bookconcern

VARCHAR

200

publish_date

DATE

10

price

FLOAT

4

amount

SMALLINT

6

remark

VARCHAR

400

表中的数据

id

title

author

bookconcern

publish_date

price

amount

remark

1

JAVA从入门到精通

孙卫琴

电子工业出版社

2004-06-01

34.00

35

null

2

JSP应用开发详解

刘小华

清华大学出版社

2005-10-03

56.00

20

null

3

MySQL数据库编程

孙鑫

人民邮电出版社

2006-06-29

78.00

10

null

4

JAVA 国际认证

元数据(ResultSetMeta接口)学习笔记相关推荐

  1. Java自学.接口学习笔记!

    接口学习笔记 文章目录 接口学习笔记 1.接口的概述与生活中的举例 2.接口定义的基本格式 3.接口的抽象方法 3.1接口抽象方法的定义 3.2接口的抽象方法使用 4.接口的默认方式 4.1接口的默认 ...

  2. 阿里云Apsara Clouder专项技能认证-实现调用API接口-学习笔记

    Apsara Clouder专项技能认证-实现调用API接口-学习笔记 阿里云的一个小认证,闲来无事,考一下 一.API简介 API的概念 API(Application Programming In ...

  3. 【vn.py学习笔记(二)】vn.py底层接口 学习笔记

    [vn.py学习笔记(二)]vn.py底层接口 学习笔记 1 CTP API的工作原理 1.1 CTP介绍 1.2 API功能介绍 1.3 CTP API文件 1.4 API 通用规则 2 CTP A ...

  4. RISCV 向量指令集和NICE接口学习笔记

    本文档链接 https://blog.csdn.net/weixin_42487906/article/details/115437890 RISCV向量指令集学习 参考链接 https://gith ...

  5. VGA 接口 学习笔记

    VGA定义 VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传输的标准.是 IBM 于1987年提出的一个使用类比讯号的电脑显示标准.这个标准已对于现 ...

  6. 接口学习笔记(2009.11.24)

    了解接口,主要是为了一道经典面试题:接口与抽象类的区别,对接口的理解却很少,现在学习一下. 接口只包含方法.属性.事件或索引器的签名.成员的实现是在实现接口的类或结构中完成的. Interface n ...

  7. Java并发39:Executor系列--ScheduleExecutorService接口学习笔记

    [超级链接:Java并发学习系列-绪论] 本章主要学习ScheduleExecutorService接口. 1.ScheduleExecutorService接口概述 @since 1.5 Sched ...

  8. HttpSessionActivationListener接口 学习笔记

    实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件 当绑定到 HttpSession 对象中的对象将要随 HttpSessio ...

  9. AJPFX关于Set接口学习笔记及总结

    Set接口中的方法和Collection中方法一致的.Set接口取出方式只有一种,迭代器. |--HashSet:底层数据结构是哈希表,线程是不同步的.无序,高效: HashSet集合保证元素唯一性: ...

最新文章

  1. linux成长笔录——week_1
  2. kvm-桥接模式(二)
  3. 新版信标的信号板调试
  4. 【 MATLAB 】信号处理工具箱之波形产生函数 tripuls
  5. gz键盘增强小工具_这些不起眼的Mac小工具,能让你的Macbook效率倍增!
  6. c++ static 静态变量初始化
  7. VC控件自绘制三步曲
  8. Qt VS Tools用不了解决方法
  9. IT技术人,“三十而已”
  10. WEG的完整形式是什么?
  11. excel统计行数_百万到亿级数据,快速统计查询
  12. idea 修改样式要编译_在IDEA中DEBUG Javac源码
  13. 青少年python编程竞赛加分_《笨方法学Python》加分题17
  14. Java 后端开发工程师进阶路线
  15. 在css中怎么做橡皮擦,js 实现橡皮擦 擦图效果(可用于刮刮卡)
  16. 台式计算机主要有哪些硬件组成,构成台式电脑主机的基本硬件有什么
  17. xs.pattern ip
  18. 中科院计算所培训中心二季度公开课安排
  19. 温故知新(一)——基于 RTOS 的软件开发理论
  20. Unity虚拟现实(VR)无编码游戏开发视频教程

热门文章

  1. linux top 显示swap,Linux top命令中的SWAP与DATA
  2. 阿里钉钉前端170+道面试题及答案分享
  3. python raise用处_raise是更好的return
  4. CountDownTimer源码解析
  5. Java数据结构之栈的数组实现
  6. RSA加解密,.net公钥/私钥兼容java
  7. 【线性代数(8)】矩阵行列式、伴随矩阵、逆矩阵
  8. 【基础操作】ubuntu解压zip文件乱码
  9. Python 网易云音乐评论爬虫
  10. 全球及中国扑克牌行业需求现状及十四五前景展望报告2022年版