package li.dao_2;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import li.model.Field;
import li.util.Log;
import li.util.Reflect;
/**
* Dao辅助类,从ResultSet中读取数据并组装对象
*
* @author li (limingwei@mail.com)
* @version 0.1.5 (2012-05-08)
* @see li.util.Reflect
*/
public class ModelBuilder {
private static final Log log = Log.init();
/**
* 保存当前查询的QueryRunner,为了回调以关闭Connection
*/
protected QueryRunner queryRunner;
/**
* 当前ModelBuilder的结果集
*/
protected ResultSet resultSet;
/**
* 初始化一个ModelBuilder
*/
public ModelBuilder(QueryRunner queryRunner, ResultSet resultSet) {
this.queryRunner = queryRunner;
this.resultSet = resultSet;
}
/**
* 从ResultSet中提取数据组装成type类型的对象的 List
*
* @param type 对象类型
* @param fields 对象属性列表
* @param count 组装对象最大个数
* @param close 是否于读取后关闭resultSet
*/
public <T> List<T> list(Class<T> type, List<Field> fields, Integer count, Boolean close) {
List<T> list = new ArrayList<T>();
try {
while (null != resultSet && resultSet.next() && (null == count || list.size() <= count)) {
T t = Reflect.born(type);
for (Field attribute : fields) {
Reflect.set(t, attribute.name, value(attribute.column, false, false));
}
list.add(t);
}
log.trace("build ? ?", list.size(), type.getName());
} catch (Exception e) {
throw new RuntimeException(e + " ", e);
} finally {
if (close) {
this.close();
}
}
return list;
}
public <T> List<T> list(Class<T> type, List<Field> fields, Boolean close) {
List<T> list = new ArrayList<T>();
try {
while (null != resultSet && resultSet.next()) {
T t = Reflect.born(type);
for (Field attribute : fields) {
Reflect.set(t, attribute.name, value(attribute.column, false, false));
}
list.add(t);
}
log.trace("build ? ?", list.size(), type.getName());
} catch (Exception e) {
throw new RuntimeException(e + " ", e);
} finally {
if (close) {
this.close();
}
}
return list;
}
/**
* 辅助方法,封装后的resultSet.getString(column);
*
* @param column 数据所在的列名或者顺序,String或者Integer类型
* @param next 读取前是否 resultSet.next()
* @param close 是否于读取后关闭resultSet
*/
public String value(Object column, Boolean next, Boolean close) {
try {
if ((null != resultSet) && ((next && resultSet.next()) || !next)) { // 若next==true,则resultSet.next()
if (column instanceof String) {// 按列名查找
return resultSet.getString((String) column);
} else if (column instanceof Integer) {// 按index查找
return resultSet.getString((Integer) column);
} else {
throw new RuntimeException("column must be String or Integer");
}
}
} catch (Exception e) {
throw new RuntimeException(e + " ", e);
} finally {
if (close) {
this.close();
}
}
return null;
}
/**
* 关闭ModelBuilder,关闭ResultSet,PreparedStatement和Connection
*
* @see li.dao.QueryRunner#close()
*/
protected void close() {
try {
if (null != resultSet) {
resultSet.close();// 关闭ResultSet
log.trace("Closed ResultSet ?", resultSet);
}
if (null != queryRunner) {
queryRunner.close();// 关闭QueryRunner,他会关闭PreparedStatement和Connection
log.trace("Closed QueryRunner ?", queryRunner);
}
} catch (Exception e) {
throw new RuntimeException(e + " ", e);
}
}
}