package message.jdbc.core; import message.base.convert.ConvertGetter; import message.datasource.convert.Convert; import message.datasource.helper.SqlHelper; import message.jdbc.type.ClobStringSqlTypeValue; import message.jdbc.type.LongStringSqlTypeValue; import message.jdbc.type.ParamType; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.NotReadablePropertyException; import org.springframework.jdbc.core.namedparam.AbstractSqlParameterSource; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** * . * * @author sunhao(sunhao.java@gmail.com) * @version V1.0 * @createTime 2012-10-8 上午05:20:39 */ public class ExtBeanPropertySqlParameterSource extends AbstractSqlParameterSource { private final BeanWrapper beanWrapper; private String[] propertyNames = null; private SqlHelper sqlHelper; public ExtBeanPropertySqlParameterSource(Object object, SqlHelper sqlHelper) { this.beanWrapper = new BeanWrapperImpl(object); this.sqlHelper = sqlHelper; } public Object getValue(String paramName) throws IllegalArgumentException { ParamType paramType; try { paramType = ParamType.getParamType(paramName); if (paramType.getValueType() == 1) return new ClobStringSqlTypeValue(this.sqlHelper, (String) this.beanWrapper.getPropertyValue(paramType.getRealParamName())); if (paramType.getValueType() == 2) { return new LongStringSqlTypeValue(this.sqlHelper, (String) this.beanWrapper.getPropertyValue(paramType.getRealParamName())); } Convert convert = getConvert(paramName); if (convert != null) { ConvertGetter convertGetter = (ConvertGetter) this.beanWrapper.getPropertyValue(paramType.getRealParamName()); if (convertGetter == null) { return convert.getDbNullValue(convertGetter); } else { return convert.getDbValue(convertGetter); } } return this.beanWrapper.getPropertyValue(paramType.getRealParamName()); } catch (NotReadablePropertyException ex) { throw new IllegalArgumentException(ex.getMessage()); } } private Convert getConvert(String paramName) { try { Field f = this.beanWrapper.getWrappedClass().getDeclaredField(paramName); Class<?> clazz = f.getType(); if (ConvertGetter.class.isAssignableFrom(clazz)) { return this.getSqlHelper().getConvert((Class<? extends ConvertGetter>) f.getType()); } else { return null; } } catch (NoSuchFieldException e) { e.printStackTrace(); } return null; } public String[] getReadablePropertyNames() { synchronized (this) { if (this.propertyNames == null) { List names = new ArrayList(); PropertyDescriptor[] props = this.beanWrapper.getPropertyDescriptors(); for (int i = 0; i < props.length; ++i) if (this.beanWrapper.isReadableProperty(props[i].getName())) names.add(props[i].getName()); this.propertyNames = ((String[]) (String[]) names.toArray(new String[names.size()])); } } return this.propertyNames; } public boolean hasValue(String paramName) { ParamType paramType = ParamType.getParamType(paramName); return this.beanWrapper.isReadableProperty(paramType.getRealParamName()); } public SqlHelper getSqlHelper() { return sqlHelper; } public void setSqlHelper(SqlHelper sqlHelper) { this.sqlHelper = sqlHelper; } }