大家有没有访问过数据库然后用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表示对应的对象尚未初始化或者没有任何内容】