(原创)JDBCTemplate 分页 功能改造 (二)
?
??? 继续上一篇的功能改造,小弟我发现每次都要根据自己定义的实体类去直接实现 PageTemplate类中private List ResultSetForList(ResultSet rs, RowMapper rm)方法中的RowMapper方法,实在是很麻烦,不但要定义实体类,每次对应不同的实体类,总是需要实现RowMapper,麻烦死了。自己根据反射机制的一部分写了一个从记录集映射实体类的小东西。下面就和大家分享一下。
?
1.DefaultMapper类
实现RowMapper 接口的基类
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.free.source.plusin.ResultSet4Bean;
public class DefaultMapper implements RowMapper {
private ResultSet4Bean rsb;
public DefaultMapper(String className)
{
?? rsb=new ResultSet4Bean(className);
}
public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
?? Object obj=new Object();
?? try {
??? obj=rsb.getBeanObject(arg0);
?? } catch (Exception e) {
??? // TODO Auto-generated catch block
??? e.printStackTrace();
?? }
?? return obj;
}
}
红色的部分就是关键了。自己写的封装注入对象的类。
?
2.ResultSet4Bean类
用于封装记录集映射实体类。
import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import com.free.source.plusin.resultset.IResultSetWrapper;
import com.free.source.plusin.resultset.ResultSetWrapperImpl;
/**
* @author TonyDev
*
*/
public class ResultSet4Bean {
private IResultSetWrapper rsp;
private BeanWrapper bw;
private String className;
public ResultSet4Bean(String className) {
?? this.className = className;
?? init();
}
private void init() {
?? rsp = new ResultSetWrapperImpl();
}
public Object getBeanObject(ResultSet rs) throws InstantiationException,
??? IllegalAccessException, ClassNotFoundException,
??? IntrospectionException, SQLException, IllegalArgumentException,
??? InvocationTargetException {
?? bw = new BeanWrapper(this.className);
?? Map<String, Object> hm = rsp.setWrapper(rs);
?? if (hm.size() > 0) {
??? bw.setProperty(hm);
?? }
?? return bw.getObj();
}
}
红色的部分是自己封装的类,请继续往下看。
?
3.IResultSetWrapper接口
用于获取记录集中实体字段属性的接口
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
/**
* @author TonyDev
*
*/
public interface IResultSetWrapper {
public Map setWrapper(ResultSet rs) throws SQLException;
}
?
4.ResultSetWrapperImpl 类
用于实现IResultSetWrapper 接口
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* @author TonyDev
*
*/
public class ResultSetWrapperImpl implements IResultSetWrapper {
/*
* (non-Javadoc)
*
*/
public Map setWrapper(ResultSet rs) throws SQLException {
?? Map <String,Object> setMap = new HashMap <String,Object>();
??
??
??? if ( rs.getRow()!=0) {
???? ResultSetMetaData rsMetaData;
???? try {
????? rsMetaData = rs.getMetaData();
????? int columnCount = rsMetaData.getColumnCount();
????? for (int i = 0; i < columnCount; i++) {
?????
?????? String columnName = rsMetaData.getColumnName(i + 1);
?????
?????? setMap.put(columnName, rs.getObject(i + 1));
????? }
???? } catch (SQLException e) {
????? // TODO Auto-generated catch block
????? e.printStackTrace();
???? }
??? }
?? return setMap;
}
}
?
5.BeanWrapper 类
用于封装注入实体属性的类。
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
/**
* @author TonyDev
*
*/
public class BeanWrapper {
private BeanInfo bf;
private Object obj;
/**
* 默认构造子,用于生成新的对象
* @param className
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws IntrospectionException
*/
public BeanWrapper(String className) throws InstantiationException,
??? IllegalAccessException, ClassNotFoundException,
??? IntrospectionException {
?? obj = Class.forName(className).newInstance();
?? bf = Introspector.getBeanInfo(obj.getClass());
}
/**
* 将参数注入对象
* @param resultsetMap
* @throws IntrospectionException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public void setProperty(Map resultsetMap) throws IntrospectionException,
??? IllegalArgumentException, IllegalAccessException,
??? InvocationTargetException {
?? PropertyDescriptor[] propDescs = bf.getPropertyDescriptors();
?? for (int i = 0; i < propDescs.length; i++) {
??? if (!propDescs[i].getName().equals("class")) {
???? String propName = propDescs[i].getName();
???? Object mapObj = resultsetMap.get(propName);
???? this.methodInvoke(propDescs[i], mapObj);
??? }
?? }
}
/**
* 参数注入到对象的方法
* @param selfObj
* @param valueObj
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
private void methodInvoke(PropertyDescriptor selfObj, Object valueObj)
??? throws IllegalArgumentException, IllegalAccessException,
??? InvocationTargetException {
?? Method method = selfObj.getWriteMethod();
?? Object arglist[] = new Object[1];
?? arglist[0] = valueObj;
?? method.invoke(obj, arglist);
}
public Object getObj() {
?? return obj;
}
public void setObj(Object obj) {
?? this.obj = obj;
}
}
红色的部分是自己定义的实体Bean的基本属性。
6.BeanInfos类
用于封装实体基本属性的类
/**
* @author TonyDev
*
*/
public class BeanInfos {
private String fieldName;??? //属性名
private Class fieldType;??? //属性类型
private Object fieldValue;??? //属性值对象
public String getFieldName() {
?? return fieldName;
}
public void setFieldName(String fieldName) {
?? this.fieldName = fieldName;
}
public Class getFieldType() {
?? return fieldType;
}
public void setFieldType(Class fieldType) {
?? this.fieldType = fieldType;
}
public Object getFieldValue() {
?? return fieldValue;
}
public void setFieldValue(Object fieldValue) {
?? this.fieldValue = fieldValue;
}
}
以上的错误处理部分没做得太详细,还往大家自己开动脑筋。
由于自己发现了许多BUG,暂时不提供JAR包,我会尽快修正。之后再开放下载