JDBC之代码复用

本文介绍了一种通过ResultSetMetaData获取数据库表结构,然后利用Object数组和Iterator遍历JDBC结果集的方法,实现与数据库结构无关的代码复用。示例代码展示了如何创建一个通用的查询方法query(),并提供了关闭数据库连接的辅助方法close()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用JDBC连接数据库的时,我们会采用executeQuery(String sql)获得一个结果集。当数据库结构变化或者获得其他数据库表结果集的时候我们需要将ResultSet结果集根据不同的数据结构重新遍历。
如何才能建立一个与数据库结构无关的JDBC连接呢?我们可以通过使用ResultSetMetaData()方法获得表结构。然后使用Object[]数组遍历结果集。当我们要取得相应的结果时,我们可以使用Iterator迭代器。只要遍历迭代器就可以取出结果。
下面是我写的一个方法:
import  java.math.BigDecimal;
import  java.sql.Connection;
import  java.sql.DriverManager;
import  java.sql.ResultSet;
import  java.sql.ResultSetMetaData;
import  java.sql.SQLException;
import  java.sql.Statement;
import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;

public   class  newJdbc  {
    
private String url = "jdbc:oracle:thin:@localhost:1521:nitpro";

    
private String dbUserName = "scott";

    
private String dbUserPassword = "tiger";

    
private Connection conn = null;

    
private Statement stmt = null;

    
private ResultSet rs = null;

    
public newJdbc() {
        
try {
            Class.forName(
"oracle.jdbc.driver.OracleDriver");
        }
 catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }


    
public Connection getConnection() {
        
try {
            conn 
= DriverManager.getConnection(url, dbUserName, dbUserPassword);
        }
 catch (SQLException e) {
            e.printStackTrace();
        }

        
return conn;
    }


    
public void close(ResultSet rs, Statement stmt, Connection conn) {
        
if (rs != null{
            
try {
                rs.close();
            }
 catch (SQLException e) {
                e.printStackTrace();
            }

        }

        
if (stmt != null{
            
try {
                stmt.close();
            }
 catch (SQLException e) {
                e.printStackTrace();
            }

        }

        
if (conn != null{
            
try {
                conn.close();
            }
 catch (SQLException e) {
                e.printStackTrace();
            }

        }

    }


    
public List query(String sql) {
        List list 
= new ArrayList();

        conn 
= this.getConnection();
        
try {
            stmt 
= conn.createStatement();
            rs 
= stmt.executeQuery(sql);
            
//获取数据库表结构
            ResultSetMetaData rsm = rs.getMetaData();
            
//取得数据库的列数
            int col = rsm.getColumnCount();
            
//生成col长度的Object数组
            Object[] obj = new Object[col];
            
//遍历结果集,将结果存入Object数组
            while (rs.next()) {
                
for (int i = 0; i < col; i++{
                    obj[i] 
= rs.getObject(i + 1);
                }

                list.add(obj);
            }

        }
 catch (SQLException e) {
            e.printStackTrace();
        }
 finally {
            
this.close(rs, stmt, conn);
        }

        
return list;
    }


    
public void update(String sql) {
        
try {
            conn 
= this.getConnection();
            stmt 
= conn.createStatement();
            stmt.executeUpdate(sql);
        }
 catch (SQLException e) {
            e.printStackTrace();
        }

    }


    
public static void main(String args[]) {
        newJdbc nj 
= new newJdbc();
        String sql 
= "select * from users";
        List list 
= nj.query(sql);
        
//返回list的迭代器
        Iterator it = list.iterator();
        
//遍历迭代器,取出结果
        while (it.hasNext()) {
            Object[] o 
= (Object[]) it.next();
            
int id = ((BigDecimal) o[0]).intValue();
            System.out.println(id);
        }


    }

}

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值