你的位置:首页 > Java教程

[Java教程]JAVA JDBC 元数据分析小结


纯干货:

获取数据库名称:

 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 }

好了先这样