【java工具类】数据库操作时ResultSet的一个替代

大家有没有访问过数据库然后用resultset来读取数据呢?每次要遍历的时候是怎么样的?

while(rs.next()){
Object ob=rs.getObject("xxx");
/*其他代码*/
}

是不是好像上面这样的?那么要换上一样怎么办?.previors()...似乎是这个函数,那么我要重复使用这个怎么办?我要直接取第一行呢?

总之我个人觉得这个方法不但原始,而且麻烦,为此我山寨了asp.net里面的datarow,datacolumn,datatable,虽然技术含量不高,但是胜在使用,现在将代码放出来。


【DataColumn类】


package Easis.DBUtility;
public class DataColumn {
    /**
     * 列的排名,以0开始,当columnNumber序号为-1时,表示该datacolumn没有经过正式赋值,是不存在的数据单元。
     */
    private int ColumnNumber=-1;

    public int getColumnNumber(){
        return ColumnNumber;
    }
    protected void setColumnNumber(int theColumnNumber){
        if(theColumnNumber<0){}
        else{
            ColumnNumber=theColumnNumber;
        }
    }

    private Object ColumnValue=new Object();
    public Object getColumnValue(){
        return ColumnValue;
    }
    protected void setColumnValue(Object ob){
        this.ColumnValue=ob;
    }
    private String ColumnName="";
    public String getColumnName(){
        return this.ColumnName;
    }
    protected void setColumnName(String column_name){
        this.ColumnName=column_name;
    }


    @Override
    public String toString() {
        return  this.getString();
    }

    public String getString(){
        if(ColumnValue==null){
            return  "";
        }
        else{
            return  ColumnValue.toString();
        }

    }
    public Boolean toBoolean(){
        String str=getString().toLowerCase().trim();
        if(str.equals("true")||str.equals("1")){
            return true;
        }
        return  false;
    }
    public int toInt(){
        int i=0;
        try{
            Integer.parseInt(getString());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return i;
    }

    public float toFloat(){
        float i=0;
        try {
            Float.parseFloat(getString());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return i;

    }

    public double toDouble(){
        double i=0;
        try {
            Double.parseDouble(getString());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return i;
    }



}

【DataRow类】

package Easis.DBUtility;

import java.util.ArrayList;
import java.util.Hashtable;

public class DataRow {
    /**
     * RowNumber从第一行开始,起始序号为0.
     */
    private int RowNumber=0;
    private int ColumnNumber=0;
    private ArrayList<DataColumn> _index_columnList=new ArrayList<DataColumn>();
    private Hashtable<String,DataColumn> _key_columnList=new Hashtable<String, DataColumn>();
    public int getRowNumber(){
        return  RowNumber;
    }

    protected void setRowNumber(int theRowNo){
        if(theRowNo<0){

        }
        else{
            RowNumber=theRowNo;
        }
    }

    /**
     * 以列的序号来获取列,最小的列序号为0.
     * @param columnIndex
     * @return
     */
    public DataColumn get(int columnIndex){
        if (this._index_columnList.size()<=columnIndex){
            return  new DataColumn();
        }
        else{
            return this._index_columnList.get(columnIndex);
        }

    }

    /**
     * 根据列名获取列。
     * @param columnName
     * @return
     */
    public DataColumn get(String columnName){
      if(this._key_columnList.containsKey(columnName)){
          return  this._key_columnList.get(columnName);
      }
        else{
          return  new DataColumn();
      }
    }

    public ArrayList<DataColumn> Columns(){
        return  this._index_columnList;
    }

    protected void addDataColumn(DataColumn dcolumn){
        if(this._key_columnList.containsKey(dcolumn.getColumnName())){}
        else{
            this._key_columnList.put(dcolumn.getColumnName(),dcolumn);
            this._index_columnList.add(dcolumn);
            this.ColumnNumber=0;

        }
    }





}

【DataTable类】

package Easis.DBUtility;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
public class DataTable {

    protected int _RowCount=-1;
    private int _columnCount=-1;
    private ArrayList<String> _columnNames=new ArrayList<String>();
    private ArrayList<DataRow> _RowList=new ArrayList<DataRow>();

    protected void setRowCount(int rowCount){
        if(_RowCount<0){}
        else{
            this._RowCount=rowCount;
        }
    }
    public int getRowCount(){
        return _RowCount;
    }

    public int getColumnCount(){
        return _columnCount;
    }
    protected void setColumnCount(int columnCount){
        if(columnCount>=0){
            _columnCount=columnCount;
        }
    }

    protected  void addColumnName(String columnName){
        this._columnNames.add(columnName);
    }

    public ArrayList<String> getColumnNames(){
        return _columnNames;
    }
   public ArrayList<DataRow> getRows(){
       return this._RowList;
   }



}

【最重要的是,可以自动将ResultSet转换为DataTable的一个辅助类】


package Easis.DBUtility;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
public class DataTableHelper {
    /**
     *
     * @param rsList 根据数据库返回的结果集来构造datatable,row,column等对象。
     * 注意 ,用完resultset对象后请关闭以释放资源。
     */
    public static    DataTable rs2datatable(ResultSet rsList){
        DataTable mytable=new DataTable();
        if(rsList==null){
          return mytable;
        }
        try{
            ResultSetMetaData mdata= rsList.getMetaData();

           mytable.setColumnCount(mdata.getColumnCount());
           boolean firstGetColumnName=true;

            /*
            这段代码是错误的,我真想不到,要获得各个column的名称还要先读取下一行。
            for (int i=0;i<mytable.getColumnCount();i++){

               String cname=mdata.getColumnName(i);
                mytable.addColumnName(cname);

            }
            */


            //-遍历该resultset,将其值放进datarow及datatable
            int cindex=0;
            while(rsList.next()){
                //-遍历
                DataRow myrow=new DataRow();
                myrow.setRowNumber(cindex);
                cindex++;
                /*
                *假如是第一次的话,那么顺便将列名加进来吧。
                * */



                //--当前datarow的参数
                for(int j=0;j<mytable.getColumnCount();j++){
                    if(firstGetColumnName==true){
                        mytable.addColumnName(mdata.getColumnName(j+1));

                    }

                   // rsList.get

                    String columnKeyName=mytable.getColumnNames().get(j);
                    Object columnValue  = rsList.getObject(j+1);
                    DataColumn dcolumn=new DataColumn();
                    dcolumn.setColumnNumber(j);
                    dcolumn.setColumnName(columnKeyName);
                    dcolumn.setColumnValue(columnValue);

                    myrow.addDataColumn(dcolumn);

                }
                firstGetColumnName=false;
                mytable.getRows().add(myrow);
            }
            return mytable;
        }
        catch (Exception e){
            e.printStackTrace();

            return mytable;
        }
    }

}

使用方法很简单,当你获取到ResultSet对象后,譬如:

    public DataTable getList(){
        Connection _conn=DBConnection.getConnection();
        DataTable dt=new DataTable();
        try {

        CallableStatement _stmt=_conn.prepareCall("{call [dbo].[manager_list]}");
             ResultSet rs= _stmt.executeQuery();
            dt= DataTableHelper.rs2datatable(rs);
            rs.close();
        }
        catch (Exception e){
            e.printStackTrace();

        }
        return dt;

    }

上面的DBConnection是一个从数据库连接池获取连接的方法,个人的封装了,各位可以用其他方式来获取数据库连接。


获取完数据集后,这样来进行调用:

  <%

            if(dtlist.getRows().size()<=0){
%>

        <tr>
            <td align="center" colspan="99">暂无记录</td>
        </tr>

 <%
            }
     else{
                for (DataRow ditem:dtlist.getRows()){

         %>
        <tr>
            <td align="center">
                <input type="checkbox" class="checkall" name="ids" value="<%=ditem.get("id")%>" />
            </td>
            <td align="left">
                <%=ditem.get("userName").toString()%>
            </td>
            <td align="left">
                  <%=ditem.get("isLock").toBoolean()==false?"正常启用":"禁用"%>
            </td>

            <td align="center"><a href="edit.rails?id=1">修改</a></td>
        </tr>
        <% }
            }
        %>

其中dtlist是利用上面getList获取到的DataTable对象。


【请注意:针对datatable的rowcount,datarow的rownumber及datacolumn的columnnumber而言,假如值为-1表示对应的对象尚未初始化或者没有任何内容】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值