码迷,mamicode.com
首页 > 数据库 > 详细

JAVA JDBC 元数据分析小结

时间:2016-04-29 14:08:15      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

纯干货:

获取数据库名称:

 1     /**
 2      * 获取数据库的名称
 3      */
 4     public void getDataBaseName() throws Exception {
 5         Connection con = DSUtils.getConnection();
 6         // 获取DataBasematedata
 7         DatabaseMetaData db = con.getMetaData();
 8         System.err.println(db.getDatabaseProductName());// 数据库的名称
 9         System.err.println(db.getDatabaseMajorVersion());// 数据库的主版本 
10         System.err.println(db.getDatabaseMinorVersion());// 数据库的小版本
11         System.err.println(db.getDriverName());// 驱动器的名称
12     }

获取数据库表名:

这里有一个地方是要注意:查询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();
    }

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

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

拐个弯先弄个表:

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

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

 1 package cn.qlu.utils;
 2 
 3 import java.io.FileOutputStream;
 4 import java.sql.Connection;
 5 import java.sql.DatabaseMetaData;
 6 import java.sql.ResultSet;
 7 import java.sql.ResultSetMetaData;
 8 import java.sql.Statement;
 9 import java.util.ArrayList;
10 import java.util.List;
11 
12 import org.apache.poi.hssf.usermodel.HSSFCell;
13 import org.apache.poi.hssf.usermodel.HSSFRow;
14 import org.apache.poi.hssf.usermodel.HSSFSheet;
15 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
16 import org.junit.Test;
17 
18 public class XlsOutputUtils {
19     String dbName;
20     String file;
21     public XlsOutputUtils(String dbmane,String file) {
22         this.dbName=dbmane;
23         this.file=file;//类似这玩意"f:/xls/"
24     }
25     /**
26      * 导出指定的数据库中的所有表 – 表中的数据
27      */
28     public void exportTableDatas() throws Exception {
29         
30 
31         HSSFWorkbook book = new HSSFWorkbook();
32 
33 
34         Connection con = DSUtils.getConnection();
35         DatabaseMetaData db = con.getMetaData();
36         // 获取这个数据库中所有的表的结果集
37         ResultSet rs = db.getTables(dbName, dbName, null, new String[] { "TABLE", "VIEW" });
38         // 将所有表名先保存到一个集合中去
39         List<String> tables = new ArrayList<String>();
40         while (rs.next()) {
41             String tName = rs.getString("TABLE_NAME");
42             tables.add(tName);
43         }
44         System.err.println("tales:" + tables);
45         Statement st = con.createStatement();
46         // 遍历所有表
47         for (String table : tables) {
48             // 创建一个工作表
49             HSSFSheet sheet = book.createSheet(table);
50 
51             // 每遍历 一个表,就查询这个表
52             String sql = "select * from " + dbName + "." + table;
53             rs = st.executeQuery(sql);// 执行查询
54             // 获取结果集的元信息
55             ResultSetMetaData rsmd = rs.getMetaData();
56             int cols = rsmd.getColumnCount();
57             // 创建第一行
58             HSSFRow row = sheet.createRow(0);
59 
60             // 获取列名
61             for (int i = 0; i < cols; i++) {
62                 String colName = rsmd.getColumnName(i + 1);
63                 // 创建一个单元格
64                 HSSFCell cel = row.createCell(i);
65                 // 设置值
66                 cel.setCellValue(colName);
67             }
68             // 获取里面的数据
69             int rowIndex = 1;
70             while (rs.next()) {
71 
72                 //
73                 row = sheet.createRow(rowIndex++);
74 
75                 // 再遍历列
76                 for (int i = 0; i < cols; i++) {
77                     // 直接获取这一列的数据
78                     Object val = rs.getObject(i + 1);
79                     //
80                     HSSFCell cel = row.createCell(i);
81                     cel.setCellValue("" + val);
82                 }
83             }
84         }
85 
86         con.close();
87         book.write(new FileOutputStream(file + dbName + ".xls"));
88     }
89 
90 }


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

  1 package cn.qlu.utils;
  2 
  3 import java.beans.PropertyDescriptor;
  4 import java.lang.reflect.Method;
  5 import java.sql.Connection;
  6 import java.sql.ParameterMetaData;
  7 import java.sql.PreparedStatement;
  8 import java.sql.ResultSet;
  9 import java.sql.ResultSetMetaData;
 10 import java.sql.SQLException;
 11 import java.sql.Statement;
 12 import java.util.ArrayList;
 13 import java.util.List;
 14 
 15 import javax.sql.DataSource;
 16 
 17 import org.apache.commons.beanutils.BeanUtils;
 18 
 19 
 20 /**
 21  * 数据操作工具类,提供对任意表的查询, 对任意对象(Bean)的封装
 22  * @author baix
 23  */
 24 @SuppressWarnings("unused")
 25 public class QueryUtils {
 26     /**
 27      * 获取连接可以通过接收DataSource
 28      */
 29     private DataSource dataSource;
 30 
 31     /**
 32      * 在实例化这个类时,接收数据源
 33      */
 34     public QueryUtils(DataSource ds) {
 35         this.dataSource = ds;
 36     }
 37 
 38     /**
 39      * 接收两个参数
 40      * 
 41      * @param sql
 42      *            : 执行的SQL
 43      * @param Class
 44      *            : 可以传递Person.class
 45      * @return
 46      */
 47     public <T> List<T> query(String sql, Class<T> cls, Object... params) {
 48         List<T> list = new ArrayList<T>();
 49         Connection con = null;
 50         PreparedStatement st = null;
 51         ResultSet rs = null;
 52         try {
 53             con = dataSource.getConnection();
 54             st = con.prepareStatement(sql);
 55             // 判断 参数的个数
 56             ParameterMetaData pmd = st.getParameterMetaData();
 57             if (pmd.getParameterCount() != params.length) {
 58                 throw new RuntimeException("何不自挂东南枝,参数个数不一样!");
59 } 60 // 设置参数 61 for (int i = 0; i < params.length; i++) { 62 st.setObject(i + 1, params[i]); 63 } 64 65 rs = st.executeQuery(); 66 67 // 获取结果集的元数据 68 ResultSetMetaData rsmd = rs.getMetaData(); 69 int cols = rsmd.getColumnCount(); 70 71 // 以下开始叫DAO数据封装 72 while (rs.next()) { 73 T p = cls.newInstance(); 74 // 获取列的名称 id - > p.setId 75 for (int i = 0; i < cols; i++) { 76 // 获取列名 77 String colName = rsmd.getColumnName(i + 1);// id - > p.setId 78 // 获取列值 79 Object obj = rs.getObject(i + 1); 80 // BeanButils 81 BeanUtils.setProperty(p, colName, obj); 82 } 83 list.add(p); 84 } 85 86 } catch (Exception e) { 87 throw new RuntimeException(e); 88 } finally { 89 try { 90 if (rs != null) { 91 rs.close(); 92 } 93 if (st != null) { 94 st.close(); 95 } 96 con.close(); 97 } catch (SQLException e) { 98 throw new RuntimeException(e); 99 } 100 } 101 return list; 102 } 103 }

好了先这样

 

JAVA JDBC 元数据分析小结

标签:

原文地址:http://www.cnblogs.com/baix/p/5445925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!