package com.baidu.unbiz.common.genericdao.mapper;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import com.baidu.unbiz.common.genericdao.util.MapperUtils;
import com.github.knightliao.apollo.db.bo.BaseObject;
/**
* GenericMapper the mapper
*/
public class GenericMapper<ENTITY extends BaseObject<K>, K extends Serializable> implements RowMapper<ENTITY> {
public GenericMapper(ORMapping<ENTITY, K> mapping) {
this.orMapping = mapping;
this.isComplexKey = orMapping.isComplexKey();
this.keyClass = orMapping.getKeyClass();
this.entityClass = orMapping.getEntityClass();
}
private boolean isComplexKey = false;
private Class<K> keyClass = null;
private Class<ENTITY> entityClass = null;
private ORMapping<ENTITY, K> orMapping = null;
private List<Setter> setters = null;
public ENTITY mapRow(ResultSet rs, int rowIndex) throws SQLException {
if (setters == null) {
ResultSetMetaData meta = rs.getMetaData();
setters = getSetters(meta);
}
try {
ENTITY entity = entityClass.newInstance();
K key = isComplexKey ? keyClass.newInstance() : null;
// FIXME
if (key != null) {
entity.setId(key);
}
for (Setter setter : setters) {
String column = setter.columnName;
Method setMethod = setter.method;
Class<?> paramType = setter.setterParamType;
if (setMethod.getName().equals("setId")) {
paramType = keyClass;
}
Object value = MapperUtils.getValue4Type(rs, column, paramType);
// FIXME
if (orMapping.isKeyColumn(column) && key != null) {
load2Entity(key, setMethod, value);
} else {
load2Entity(entity, setMethod, value);
}
}
return entity;
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("error in loadEntity");
}
}
/**
* @param entity
* @param setMethod
* @param value
*
* @throws Exception 下午4:06:04 created by Darwin(Tianxin)
*/
private void load2Entity(Object entity, Method setMethod, Object value) throws Exception {
try {
if (value != null) {
setMethod.invoke(entity, value);
}
} catch (Exception e) {
String sValue = value.toString();
String sValueClass = value.getClass().toString();
System.out.println("Error in " + setMethod.getName() + " invoke with param :" + sValue + " type is " +
sValueClass);
throw e;
}
}
/**
* @param meta
* @param genericMapper2
*
* @return 下午3:45:38 created by Darwin(Tianxin)
*
* @throws SQLException
*/
private List<Setter> getSetters(ResultSetMetaData meta) throws SQLException {
int columnCount = meta.getColumnCount();
List<Setter> setters = new ArrayList<Setter>(columnCount);
for (int i = 1; i <= columnCount; i++) {
String column = meta.getColumnName(i);
Method setMethod = orMapping.getSetter(column);
if (setMethod != null) {
Setter setter = new Setter(setMethod, column, setMethod.getParameterTypes()[0]);
setters.add(setter);
}
}
return setters;
}
}
class Setter {
Method method;
String columnName;
Class<?> setterParamType;
public Setter(Method method, String columnName, Class<?> setterParamType) {
this.method = method;
this.columnName = columnName;
this.setterParamType = setterParamType;
}
}