纯干货:

获取数据库名称:

     /**
* 获取数据库的名称
*/
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. ajax跳转页面问题

    $.ajax({ type:"POST", url: //你的请求程序页面随便啦 async:false,//同步:意思是当有返回值以后才会进行后面的js程序. data://请求 ...

  2. C#中Thread类中Join方法的理解(转载)

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 using System; namespace TestThreadJoin { class Pro ...

  3. 数据库的应用——直接从内存中读取osg节点 (转)

    数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件 ...

  4. Swift - 本地消息的推送通知(附样例)

    使用UILocalNotification可以很方便的实现消息的推送功能.我们可以设置这个消息的推送时间,推送内容等. 当推送时间一到,不管用户在桌面还是其他应用中,屏幕上方会都显示出推送消息. 1, ...

  5. [Java] 识别图片验证码

    现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...

  6. iOS开发——多线程OC篇&多线程中的单例

    多线程中的单例 #import "DemoObj.h" @implementation DemoObj static DemoObj *instance; // 在iOS中,所有对 ...

  7. JRebel_修改class后无法正确调试问题解决【2014-03-12】

    原文地址:http://www.cnblogs.com/hbbbs/p/3596179.html 现象 修改了class,编译后,JRebel自动装载到Web容器中.但此时调试这个类会发现无法正常调试 ...

  8. 《转》Java中HashMap详解

    HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实 ...

  9. L - Fabled Rooks(中途相遇法和贪心)

    Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...

  10. The calculation of GPA

    Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计算GPA(grade point average) 又称GPR(g ...