论坛首页 入门技术论坛

对JDBC的小小封装

浏览 3836 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-03-01  
今天对JDBC进行了小小的封装
传入任意查询 SQL 语句,以表格的形式返回查询结果:

public class DB
{
    Connection conn;
   
    PreparedStatement ps = null;
   
    ResultSet rs = null;
   
    StringBuilder result = new StringBuilder();
   
    String[][] resultTable = null;

    public DB() throws Exception{
       
    }

    public String[][] queryForList(String sqlStr) throws Exception
    {
        if (sqlStr == null || sqlStr == "")
            throw new RuntimeException("缺少参数");
       
        if (!sqlStr.startsWith("select"))
            throw new RuntimeException("SQL语法错误");
        sqlStr = sqlStr.trim().replaceAll(";", "");
        //计算行数
        String countStr = "select count(*) from ( " + sqlStr + " )";
        conn = DBUtil.getConnection();
        ps = conn.prepareStatement(countStr);
        rs = ps.executeQuery();
        int rowCount = 0;
        if (rs.next())
            rowCount = rs.getInt(1) + 1;
        // 计算列数
        // 先提取select 和 from 之间的字符串
        String tempStr = sqlStr;
        tempStr = tempStr.substring("select".length(), tempStr.indexOf("from"));
        String[] array = tempStr.split(",");
        int colCount = array.length;
       
        ps = conn.prepareStatement(sqlStr);
        rs = ps.executeQuery();
        resultTable = new String[rowCount][colCount];
        resultTable[0] = tempStr.split(",");
        int rows = 1;
        while (rs.next())
        {
            int cols = 0;
            while (true)
            {
                try
                {
                    rs.getString(++cols);
                }
                catch (Exception e)
                {
                    break;
                }
            }
            String[] row = new String[cols-1];
            for (int i = 1; i < cols ; i++)
            {
                row[i - 1] = rs.getString(i);
            }
            if (rows <rowCount)
                resultTable[rows++] = row;
           
        }
       
        DBUtil.closeConnection(conn, ps, rs);
       
        for(int i=0;i<resultTable.length;i++){
            for(int j=0;j<resultTable[i].length;j++){
                System.out.print(resultTable[i][j]+" ");
            }
            System.out.println();
        }
       
        return resultTable;
    }
}
   发表时间:2011-03-01  
1.ps,rs,conn请正确关闭
2.请使用ResultSetMetaData
3.字符串比较请用equals
4.请保证能在mysql下运行
0 请登录后投票
   发表时间:2011-03-01  
异常设计的有些欠缺
0 请登录后投票
   发表时间:2011-03-01  
select a as name,b as sex, c age from user

你的表头成什么了。。。
0 请登录后投票
   发表时间:2011-03-01  
我记得有些数据库字段取别名的时候可以用as,也可以不用的吧?
0 请登录后投票
   发表时间:2011-03-01  
这东西上首页了???
0 请登录后投票
   发表时间:2011-03-01  
select * from AA

怎么办....
0 请登录后投票
   发表时间:2011-03-01  
freish 写道
我记得有些数据库字段取别名的时候可以用as,也可以不用的吧?

oracle可以不用
0 请登录后投票
   发表时间:2011-03-01  
强大的一楼!!!
0 请登录后投票
   发表时间:2011-03-03  
finallygo 写道
1.ps,rs,conn请正确关闭
2.请使用ResultSetMetaData
3.字符串比较请用equals
4.请保证能在mysql下运行


1. DBUtil.closeConnection(conn, ps, rs);
   在这里面全部关闭了
2.嗯
3.用equals 更好
4,目前是在Oracle下跑的

看的比较仔细啊
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics