元数据(ResultSetMeta接口)学习笔记
利用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接口)学习笔记相关推荐
- Java自学.接口学习笔记!
接口学习笔记 文章目录 接口学习笔记 1.接口的概述与生活中的举例 2.接口定义的基本格式 3.接口的抽象方法 3.1接口抽象方法的定义 3.2接口的抽象方法使用 4.接口的默认方式 4.1接口的默认 ...
- 阿里云Apsara Clouder专项技能认证-实现调用API接口-学习笔记
Apsara Clouder专项技能认证-实现调用API接口-学习笔记 阿里云的一个小认证,闲来无事,考一下 一.API简介 API的概念 API(Application Programming In ...
- 【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 ...
- RISCV 向量指令集和NICE接口学习笔记
本文档链接 https://blog.csdn.net/weixin_42487906/article/details/115437890 RISCV向量指令集学习 参考链接 https://gith ...
- VGA 接口 学习笔记
VGA定义 VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传输的标准.是 IBM 于1987年提出的一个使用类比讯号的电脑显示标准.这个标准已对于现 ...
- 接口学习笔记(2009.11.24)
了解接口,主要是为了一道经典面试题:接口与抽象类的区别,对接口的理解却很少,现在学习一下. 接口只包含方法.属性.事件或索引器的签名.成员的实现是在实现接口的类或结构中完成的. Interface n ...
- Java并发39:Executor系列--ScheduleExecutorService接口学习笔记
[超级链接:Java并发学习系列-绪论] 本章主要学习ScheduleExecutorService接口. 1.ScheduleExecutorService接口概述 @since 1.5 Sched ...
- HttpSessionActivationListener接口 学习笔记
实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件 当绑定到 HttpSession 对象中的对象将要随 HttpSessio ...
- AJPFX关于Set接口学习笔记及总结
Set接口中的方法和Collection中方法一致的.Set接口取出方式只有一种,迭代器. |--HashSet:底层数据结构是哈希表,线程是不同步的.无序,高效: HashSet集合保证元素唯一性: ...
最新文章
- linux成长笔录——week_1
- kvm-桥接模式(二)
- 新版信标的信号板调试
- 【 MATLAB 】信号处理工具箱之波形产生函数 tripuls
- gz键盘增强小工具_这些不起眼的Mac小工具,能让你的Macbook效率倍增!
- c++ static 静态变量初始化
- VC控件自绘制三步曲
- Qt VS Tools用不了解决方法
- IT技术人,“三十而已”
- WEG的完整形式是什么?
- excel统计行数_百万到亿级数据,快速统计查询
- idea 修改样式要编译_在IDEA中DEBUG Javac源码
- 青少年python编程竞赛加分_《笨方法学Python》加分题17
- Java 后端开发工程师进阶路线
- 在css中怎么做橡皮擦,js 实现橡皮擦 擦图效果(可用于刮刮卡)
- 台式计算机主要有哪些硬件组成,构成台式电脑主机的基本硬件有什么
- xs.pattern ip
- 中科院计算所培训中心二季度公开课安排
- 温故知新(一)——基于 RTOS 的软件开发理论
- Unity虚拟现实(VR)无编码游戏开发视频教程