package jef.database.wrapper.populator;
import java.sql.SQLException;
import java.util.Map;
import jef.database.DataObject;
import jef.database.DebugUtil;
import jef.database.IQueryableEntity;
import jef.database.LazyLoadProcessor;
import jef.database.dialect.type.ColumnMappings;
import jef.database.innerpool.InstancePopulator;
import jef.database.jdbc.result.IResultSet;
import jef.database.meta.ITableMetadata;
import jef.tools.reflect.BeanWrapper;
public final class ObjectPopulator implements InstancePopulator{
ITableMetadata meta;
Map<String,ColumnDescription> data;
int bindRowidForColumn;
LazyLoadProcessor processor;
public ObjectPopulator(ITableMetadata meta,Map<String,ColumnDescription> data){
this.meta=meta;
this.data=data;
}
/**
* @param wrapper
* @param rs
* @return true if there is any valid field for thie object.
* @throws SQLException
*/
public boolean processOrNull(BeanWrapper wrapper, IResultSet rs) throws SQLException {
boolean flag=false;
for(Map.Entry<String,ColumnDescription> entry:data.entrySet()){
String fieldName=entry.getKey();
ColumnDescription c=entry.getValue();
// Note: 使用getObject方法时,在Oracle 2008-2-2 10.2.4.0驱动下会变为getDate(),从而丢失时分秒。
Object obj=c.getAccessor().jdbcGet(rs, c.getN());
if(!flag && obj!=null){
flag=true;
}
if(obj!=null){
wrapper.setPropertyValue(fieldName, obj);
}
}
if(bindRowidForColumn>0){
String rowid=(String)ColumnMappings.ROWID.jdbcGet(rs, bindRowidForColumn);
((IQueryableEntity) wrapper.getWrapped()).bindRowid(rowid);
}
if(processor!=null){
DataObject da = (DataObject) wrapper.getWrapped();
DebugUtil.addLazy(da, processor);
}
return flag;
}
public void process(BeanWrapper wrapper, IResultSet rs) throws SQLException {
for(Map.Entry<String,ColumnDescription> entry:data.entrySet()){
String fieldName=entry.getKey();
ColumnDescription c=entry.getValue();
// Note: 使用getObject方法时,在Oracle 2008-2-2 10.2.4.0驱动下会变为getDate(),从而丢失时分秒。
Object obj=c.getAccessor().jdbcGet(rs, c.getN());
wrapper.setPropertyValue(fieldName, obj);
}
if(bindRowidForColumn>0){
String rowid=(String)ColumnMappings.ROWID.jdbcGet(rs, bindRowidForColumn);
((IQueryableEntity) wrapper.getWrapped()).bindRowid(rowid);
}
if(processor!=null){
DataObject da = (DataObject) wrapper.getWrapped();
DebugUtil.addLazy(da, processor);
}
}
public void setProcessor(LazyLoadProcessor processor) {
this.processor = processor;
}
public IQueryableEntity instance() {
IQueryableEntity entity=meta.newInstance();
entity.stopUpdate();
return entity;
}
public Class<?> getObjectType(){
return meta.getContainerType();
}
}