JDBC之用元数据将结果集封装为List对象

JDBC的方法里面有着一套对数据库元数据操作的API.通过这些API我们可以获得数据库以及驱动等信息,也可以获得结果集的一些信息.而有些信息平时用的也比较少,这里就不一一介绍.

在这里主要给大家演示一下DatabaseMetaData和ResultSetMetaData的用法.

先看下数据表结构

然后代码如下.依然借用上节整合的DBUtils和新演示类MetaOper

DBUtils.java

package  com.test.jdbc;

import  java.sql.Connection;
import  java.sql.DriverManager;
import  java.sql.ResultSet;
import  java.sql.SQLException;
import  java.sql.Statement;
/**
 * 
@author  Administrator
 * 模板类DBUtils
 
*/
public   final   class  DBUtils {
    
//  参数定义
     private   static  String url  =   " jdbc:mysql://localhost:3306/mytest " //  数据库地址
     private   static  String username  =   " root " //  数据库用户名
     private   static  String password  =   " root " //  数据库密码

    
private  DBUtils() {

    }
    
//  加载驱动
     static  {
        
try  {
            Class.forName(
" com.mysql.jdbc.Driver " );
        } 
catch  (ClassNotFoundException e) {
            System.out.println(
" 驱动加载出错! " );
        }
    }

    
//  获得连接
     public   static  Connection getConnection()  throws  SQLException {
        
return  DriverManager.getConnection(url, username, password);
    }

    
//  释放连接
     public   static   void  free(ResultSet rs, Statement st, Connection conn) {
        
try  {
            
if  (rs  !=   null ) {
                rs.close(); 
//  关闭结果集
            }
        } 
catch  (SQLException e) {
            e.printStackTrace();
        } 
finally  {
            
try  {
                
if  (st  !=   null ) {
                    st.close(); 
//  关闭Statement
                }
            } 
catch  (SQLException e) {
                e.printStackTrace();
            } 
finally  {
                
try  {
                    
if  (conn  !=   null ) {
                        conn.close(); 
//  关闭连接
                    }
                } 
catch  (SQLException e) {
                    e.printStackTrace();
                }

            }

        }

    }

}

MetaOper.java

package  com.test.jdbc;

import  java.sql.Connection;
import  java.sql.DatabaseMetaData;
import  java.sql.PreparedStatement;
import  java.sql.ResultSet;
import  java.sql.ResultSetMetaData;
import  java.util.ArrayList;
import  java.util.HashMap;
import  java.util.List;
import  java.util.Map;

/**
 * 
 * 
@author  Administrator 
 * MetaOper: 通过ResultSetMetaData元数据,设置灵活查询语句
 * 
 
*/
public   class  MetaOper {

    
public   static   void  main(String[] args) {
        DbMeta();

        List
< Map < String, Object >>  datas  =  read( " select * from users where id < 3 " );
        System.out.println(
" ----------List数据返回------------ " );
        System.out.print(datas);
    }

    
//  通过结果集元数据封装List结果集
     public   static  List < Map < String, Object >>  read(String sql) {
        Connection conn 
=   null ;
        PreparedStatement ps 
=   null ;
        ResultSet rs 
=   null ;

        
try  {
            conn 
=  DBUtils.getConnection();
            ps 
=  conn.prepareStatement(sql);
            rs 
=  ps.executeQuery();
            ResultSetMetaData rsmd 
=  ps.getMetaData();

            
//  取得结果集列数
             int  columnCount  =  rsmd.getColumnCount();

            
//  构造泛型结果集
            List < Map < String, Object >>  datas  =   new  ArrayList < Map < String, Object >> ();
            Map
< String, Object >  data  =   null ;

            
//  循环结果集
             while  (rs.next()) {
                data 
=   new  HashMap < String, Object > ();
                
//  每循环一条将列名和列值存入Map
                 for  ( int  i  =   1 ; i  <  columnCount; i ++ ) {
                    data.put(rsmd.getColumnLabel(i), rs.getObject(rsmd
                            .getColumnLabel(i)));
                }
                
//  将整条数据的Map存入到List中
                datas.add(data);
            }
            
return  datas;
        } 
catch  (Exception e) {
            
throw   new  RuntimeException();
        } 
finally  {
            DBUtils.free(rs, ps, conn);
        }
    }

    
//  通过数据库元数据获得服务器信息
     public   static   void  DbMeta() {
        Connection conn 
=   null ;
        
try  {
            conn 
=  DBUtils.getConnection();
            DatabaseMetaData dbma 
=  conn.getMetaData();
            System.out.println(
" ----------数据库信息------------ " );
            System.out.println(
" 数据库名称:  "   +  dbma.getDatabaseProductName());
            System.out.println(
" 驱动版本:  "   +  dbma.getDriverVersion());
        } 
catch  (Exception e) {
            
throw   new  RuntimeException();
        }
    }

}

代码运行结果:

----------数据库信息------------
数据库名称:  MySQL
驱动版本:  mysql-connector-java- 5 . 0 . 8  (  Revision:  ${svn.Revision} )
----------List数据返回------------
[{lastname=啡, age=
22 , firstname=咖}, {lastname= 434 , age= 25 , firstname=ni }]

主要是read方法通过ResultSetMetaData使sql语句的使用增加了灵活性.但也减弱了可读性.以后文章会介绍使用反射机制来优化以上代码.敬请期待!
以上摘自http://www.cnblogs.com/bluedream2009/archive/2009/10/23/1588401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值