纯干货:

获取数据库名称:

     /**
* 获取数据库的名称
*/
public void getDataBaseName() throws Exception {
Connection con = DSUtils.getConnection();
// 获取DataBasematedata
DatabaseMetaData db = con.getMetaData();
System.err.println(db.getDatabaseProductName());// 数据库的名称
System.err.println(db.getDatabaseMajorVersion());// 数据库的主版本
System.err.println(db.getDatabaseMinorVersion());// 数据库的小版本
System.err.println(db.getDriverName());// 驱动器的名称
}

获取数据库表名:

这里有一个地方是要注意:查询mysql数据库的时候要在getTables的前两个参数里传入自己数据库名称,两个一样就行了

但是查询Oracle数据库的时候需要传入用户名但是必须大写!必须大写!必须大写!

    /**
* 获取某个数据库中有多少表
*/public void testGetTable() throws Exception {
Connection con = DSUtils.getConnection();
DatabaseMetaData db = con.getMetaData();
// 获取这个数据库中所有的表的结果集
// 访问oracle时要大写!!!
ResultSet rs = db.getTables("BAI", "BAI", null, new String[] { "TABLE" });
while (rs.next()) {
String tName = rs.getString("TABLE_NAME");
System.err.println(tName);
}
con.close();
}

分析一个表有多少列及列的类型:

     /**
* 使用ResultSetMatedata分析一个表有多少列 及列的类型
*/
public void testTableColumns() throws Exception {
Connection con = DSUtils.getConnection();
Statement st = con.createStatement();
String sql = "select * from person";
ResultSet rs = st.executeQuery(sql);
// 获取结果集的元信息
ResultSetMetaData rsmd = rs.getMetaData();
// 获取列的数量
int cols = rsmd.getColumnCount();
// 遍历列的的数量获取列的名称
for (int i = 1; i <= cols; i++) {
String name = rsmd.getColumnName(i);
String type = rsmd.getColumnTypeName(i);
int size = rsmd.getColumnDisplaySize(i);
System.err.println(name + " " + type + "(" + size + ")");
}
}

拐个弯先弄个表:

     /**
* 创建一个新的Excel文件
*/
public void createExcel() throws Exception {
// 1:创建一个工作文件
HSSFWorkbook book = new HSSFWorkbook();
// 2:创建一个工作表
HSSFSheet sheet = book.createSheet("Sheet1");
// 3:创建一行
HSSFRow row = sheet.createRow(0);
// 创建一个单元格
HSSFCell cel = row.createCell(0);
// 保存数据
cel.setCellValue("hello");
// 保存这个文件
book.write(new FileOutputStream("f:/a.xls"));
}

好吧,元数据分析到底有啥用?我也没搞明白点啥,不过可以开发一个工具类玩玩:

 package cn.qlu.utils;

 import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test; public class XlsOutputUtils {
String dbName;
String file;
public XlsOutputUtils(String dbmane,String file) {
this.dbName=dbmane;
this.file=file;//类似这玩意"f:/xls/"
}
/**
* 导出指定的数据库中的所有表 – 表中的数据
*/
public void exportTableDatas() throws Exception { HSSFWorkbook book = new HSSFWorkbook(); Connection con = DSUtils.getConnection();
DatabaseMetaData db = con.getMetaData();
// 获取这个数据库中所有的表的结果集
ResultSet rs = db.getTables(dbName, dbName, null, new String[] { "TABLE", "VIEW" });
// 将所有表名先保存到一个集合中去
List<String> tables = new ArrayList<String>();
while (rs.next()) {
String tName = rs.getString("TABLE_NAME");
tables.add(tName);
}
System.err.println("tales:" + tables);
Statement st = con.createStatement();
// 遍历所有表
for (String table : tables) {
// 创建一个工作表
HSSFSheet sheet = book.createSheet(table); // 每遍历 一个表,就查询这个表
String sql = "select * from " + dbName + "." + table;
rs = st.executeQuery(sql);// 执行查询
// 获取结果集的元信息
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
// 创建第一行
HSSFRow row = sheet.createRow(0); // 获取列名
for (int i = 0; i < cols; i++) {
String colName = rsmd.getColumnName(i + 1);
// 创建一个单元格
HSSFCell cel = row.createCell(i);
// 设置值
cel.setCellValue(colName);
}
// 获取里面的数据
int rowIndex = 1;
while (rs.next()) { // 行
row = sheet.createRow(rowIndex++); // 再遍历列
for (int i = 0; i < cols; i++) {
// 直接获取这一列的数据
Object val = rs.getObject(i + 1);
//
HSSFCell cel = row.createCell(i);
cel.setCellValue("" + val);
}
}
} con.close();
book.write(new FileOutputStream(file + dbName + ".xls"));
} }

还可以搞个实用一点的:数据操作工具类,提供对任意表的查询, 对任意对象(Bean)的封装

 package cn.qlu.utils;

 import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import javax.sql.DataSource; import org.apache.commons.beanutils.BeanUtils; /**
* 数据操作工具类,提供对任意表的查询, 对任意对象(Bean)的封装
* @author baix
*/
@SuppressWarnings("unused")
public class QueryUtils {
/**
* 获取连接可以通过接收DataSource
*/
private DataSource dataSource; /**
* 在实例化这个类时,接收数据源
*/
public QueryUtils(DataSource ds) {
this.dataSource = ds;
} /**
* 接收两个参数
*
* @param sql
* : 执行的SQL
* @param Class
* : 可以传递Person.class
* @return
*/
public <T> List<T> query(String sql, Class<T> cls, Object... params) {
List<T> list = new ArrayList<T>();
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = dataSource.getConnection();
st = con.prepareStatement(sql);
// 判断 参数的个数
ParameterMetaData pmd = st.getParameterMetaData();
if (pmd.getParameterCount() != params.length) {
throw new RuntimeException("何不自挂东南枝,参数个数不一样!");
}
// 设置参数
for (int i = 0; i < params.length; i++) {
st.setObject(i + 1, params[i]);
} rs = st.executeQuery(); // 获取结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount(); // 以下开始叫DAO数据封装
while (rs.next()) {
T p = cls.newInstance();
// 获取列的名称 id - > p.setId
for (int i = 0; i < cols; i++) {
// 获取列名
String colName = rsmd.getColumnName(i + 1);// id - > p.setId
// 获取列值
Object obj = rs.getObject(i + 1);
// BeanButils
BeanUtils.setProperty(p, colName, obj);
}
list.add(p);
} } catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
con.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return list;
}
}

好了先这样

JAVA JDBC 元数据分析小结的更多相关文章

  1. Java JDBC 数据库链接小结随笔

    Java JDBC 数据库链接小结随笔 一.链接数据库的步骤 二.关于Statement  和  PrepareStatement 两者区别 用法 三.关于 ResultSet 的一些小结 四.自定义 ...

  2. Java JDBC基础学习小结

    JDBC是一个Java应用程序接口,作用是封装了对数据库的各种操作.JDBC由类和接口组成,使用Java开发数据库应用都需要4个主要的接口:Driver.Connection.Statement.Re ...

  3. java jdbc preparedstatement 分析

    https://blog.csdn.net/xiong9999/article/details/54137326

  4. Java JDBC高级特性

    1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现 ...

  5. java学习笔记—c3p0连接池与元数据分析(42)

    第一步:导入c3p0包 第二步:在classpath目录下,创建一个c3p0-config.xml <?xml version="1.0" encoding="UT ...

  6. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  7. JAVA jdbc(数据库连接池)学习笔记(二) SQL注入

    PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念...   所谓SQL注 ...

  8. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  9. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

随机推荐

  1. AIM Tech Round (Div. 2) C. Graph and String 二分图染色

    C. Graph and String 题目连接: http://codeforces.com/contest/624/problem/C Description One day student Va ...

  2. Codeforces Round #290 (Div. 2) A. Fox And Snake 水题

    A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...

  3. C#窗体钉在桌面、置底、嵌入桌面的办法

    想做一个桌面时钟,钉在桌面上不影响正常使用,只在看桌面的时候显示. 从网上多方寻找找到这么个代码,但是还是有不方便的地方,大家探讨一下. 这个程序在使用“显示桌面”的时候还可以显示,将程序的Form1 ...

  4. 免费LInux主机资源

    一.m-net.arbornet.org注冊 (1)telnet m-net.arbornet.org vista系统默认是关闭telnet的(由于不安全),须要开启.cmd->telnet(2 ...

  5. HTML之一 符号实体

    符号实体和”语言代码“以及”字符集“无关.

  6. html页面head区域的编码书写规范

    今天我们简单的介绍一下head区域主要放置了内容.这里就不强调css和javascript了,这两者是大家所熟知的. head区一般必须加入的标识有: 公司版权注释 <!--- the site ...

  7. [Express] Level 3: Massaging User Data

    Flexible Routes Our current route only works when the city name argument matches exactly the propert ...

  8. Foundation框架之NSString及其Mutable类型

    Foundation框架之NSString及其Mutable类型 目录 概述 对字符串的实用操作 拼接 拆分 字符串比较 是否包含某字符串 字数统计 大小写转换 具体的方法参见API 待研究 概述 对 ...

  9. Device Pixel Ratio & Media Queries

    一些重要的名词解释: CSS pixels(CSS 像素):详见http://www.w3.org/TR/css3-values/#reference-pixe CSS声明的像素值,可随着放大缩小而放 ...

  10. fcitx的安装_配置

    sudo apt-get purger ibus 安装Fcitx:sudo apt-get install im-switch fcitx #修改当前用户的默认输入法, 具体看man im-switc ...