1.首先是MyBeanProcessor:
重写BeanProcessor的实现,使用策略模式
package c3p0.util2;
import java.beans.PropertyDescriptor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import org.apache.commons.dbutils.BeanProcessor;
/**
* 策略模式的BeanProcessor
*/
public class MyBeanProcessor extends BeanProcessor {
private Matcher matcher;
public MyBeanProcessor() {
}
public MyBeanProcessor(Matcher matcher) {
this.matcher = matcher;
}
public Matcher getMatcher() {
return matcher;
}
public void setMatcher(Matcher matcher) {
this.matcher = matcher;
}
/**
* 重写BeanProcessor的实现,使用策略模式
*/
protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
PropertyDescriptor[] props) throws SQLException {
if (matcher == null)
throw new IllegalStateException("Matcher must be setted!");
int cols = rsmd.getColumnCount();
int columnToProperty[] = new int[cols + 1];
Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
for (int col = 1; col <= cols; col++) {
String columnName = rsmd.getColumnLabel(col);
if (null == columnName || 0 == columnName.length()) {
columnName = rsmd.getColumnName(col);
}
for (int i = 0; i < props.length; i++) {
if (matcher.match(columnName, props[i].getName())) {// 与BeanProcessor不同的地方
columnToProperty[col] = i;
break;
}
}
}
return columnToProperty;
}
}
MyBeanProcessor重写了BeanProcessor的mapColumnsToProperties方法,把原先写死的字段名与属性名的匹配逻辑交由Matcher来实现
2.Matcher是一个接口,它是”字段名与属性名是否匹配”的抽象.
下面是接口Matcher:
package com.recommend.utils.db;
public interface Matcher {
/**
* 判断字段名与属性名是否匹配
*
* @param columnName
* 字段名
* @param propertyName
* 属性名
* @return 匹配结果
*/
boolean match(String columnName, String propertyName);
}
3. match.三个个常用实现,分别是MappingMatcher(二维数组匹配)与HumpMatcher(驼峰命名匹配)以及XmlMatcher:
XmlMatcher:
<