Search in sources :

Example 11 with BeanProperty

use of cn.taketoday.beans.BeanProperty in project today-infrastructure by TAKETODAY.

the class BeanPropertyRowMapper method mapRow.

/**
 * Extract the values for all columns in the current row.
 * <p>Utilizes public setters and result set meta-data.
 *
 * @see ResultSetMetaData
 */
@Override
public T mapRow(ResultSet rs, int rowNumber) throws SQLException {
    BeanWrapperImpl beanWrapper = this.beanWrapper;
    T mappedObject = constructMappedInstance(rs, beanWrapper);
    beanWrapper.setBeanInstance(mappedObject);
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    Set<String> populatedProperties = isCheckFullyPopulated() ? new HashSet<>() : null;
    HashMap<String, BeanProperty> mappedFields = this.mappedFields;
    for (int index = 1; index <= columnCount; index++) {
        String column = JdbcUtils.lookupColumnName(rsmd, index);
        String field = lowerCaseName(StringUtils.delete(column, " "));
        BeanProperty property = mappedFields != null ? mappedFields.get(field) : null;
        if (property != null) {
            try {
                // TODO using TypeHandler
                Object value = getColumnValue(rs, index, property);
                if (rowNumber == 0 && debugEnabled) {
                    log.debug("Mapping column '{}' to property '{}' of type '{}'", column, property.getName(), ClassUtils.getQualifiedName(property.getType()));
                }
                try {
                    beanWrapper.setPropertyValue(property.getName(), value);
                } catch (TypeMismatchException ex) {
                    if (value == null && this.primitivesDefaultedForNullValue) {
                        if (debugEnabled) {
                            log.debug("Intercepted TypeMismatchException for row {} and column '{}'" + " with null value when setting property '{}' of type '{}' on object: {}", rowNumber, column, property.getName(), ClassUtils.getQualifiedName(property.getType()), mappedObject, ex);
                        }
                    } else {
                        throw ex;
                    }
                }
                if (populatedProperties != null) {
                    populatedProperties.add(property.getName());
                }
            } catch (NotWritablePropertyException ex) {
                throw new DataRetrievalFailureException("Unable to map column '" + column + "' to property '" + property.getName() + "'", ex);
            }
        } else {
            // No BeanProperty found
            if (rowNumber == 0 && debugEnabled) {
                log.debug("No property found for column '{}' mapped to field '{}'", column, field);
            }
        }
    }
    if (populatedProperties != null && !populatedProperties.equals(this.mappedProperties)) {
        throw new InvalidDataAccessApiUsageException("Given ResultSet does not contain all fields " + "necessary to populate object of " + this.mappedClass + ": " + this.mappedProperties);
    }
    return mappedObject;
}
Also used : BeanWrapperImpl(cn.taketoday.beans.BeanWrapperImpl) TypeMismatchException(cn.taketoday.beans.TypeMismatchException) BeanProperty(cn.taketoday.beans.BeanProperty) ResultSetMetaData(java.sql.ResultSetMetaData) NotWritablePropertyException(cn.taketoday.beans.NotWritablePropertyException) InvalidDataAccessApiUsageException(cn.taketoday.dao.InvalidDataAccessApiUsageException) DataRetrievalFailureException(cn.taketoday.dao.DataRetrievalFailureException)

Example 12 with BeanProperty

use of cn.taketoday.beans.BeanProperty in project today-infrastructure by TAKETODAY.

the class BeanPropertyRowMapper method initialize.

protected void initialize(Class<T> mappedClass, BeanMetadata metadata) {
    this.mappedClass = mappedClass;
    setConversionService(ApplicationConversionService.getSharedInstance());
    HashSet<String> mappedProperties = new HashSet<>();
    HashMap<String, BeanProperty> mappedFields = new HashMap<>();
    for (BeanProperty property : metadata) {
        if (property.isWriteable()) {
            String lowerCaseName = lowerCaseName(property.getName());
            mappedFields.put(lowerCaseName, property);
            String underscoreName = underscoreName(property.getName());
            if (!lowerCaseName.equals(underscoreName)) {
                mappedFields.put(underscoreName, property);
            }
            mappedProperties.add(property.getName());
        }
    }
    this.mappedFields = mappedFields;
    this.mappedProperties = mappedProperties;
}
Also used : HashMap(java.util.HashMap) HashSet(java.util.HashSet) BeanProperty(cn.taketoday.beans.BeanProperty)

Example 13 with BeanProperty

use of cn.taketoday.beans.BeanProperty in project today-framework by TAKETODAY.

the class JmxUtilsTests method getAttributeNameWithoutStrictCasing.

@Test
void getAttributeNameWithoutStrictCasing() {
    BeanProperty pd = new BeanWrapperImpl(AttributeTestBean.class).getBeanProperty("name");
    String attributeName = JmxUtils.getAttributeName(pd, false);
    assertThat(attributeName).as("Incorrect casing on attribute name").isEqualTo("name");
}
Also used : BeanWrapperImpl(cn.taketoday.beans.BeanWrapperImpl) BeanProperty(cn.taketoday.beans.BeanProperty) Test(org.junit.jupiter.api.Test)

Example 14 with BeanProperty

use of cn.taketoday.beans.BeanProperty in project today-framework by TAKETODAY.

the class Dialect method insert.

public String insert(SQLParams sqlParams) {
    StringBuilder sql = new StringBuilder();
    sql.append("INSERT INTO ").append(sqlParams.getTableName());
    StringBuilder columnNames = new StringBuilder();
    StringBuilder placeholder = new StringBuilder();
    JdbcBeanMetadata beanMetadata = new JdbcBeanMetadata(sqlParams.getModelClass());
    Object model = sqlParams.getModel();
    for (BeanProperty property : beanMetadata) {
        Object value = property.getValue(model);
        if (value != null) {
            columnNames.append(",").append(" ").append(property.getName());
            placeholder.append(", ?");
        }
    }
    if (columnNames.length() > 0 && placeholder.length() > 0) {
        sql.append("(").append(columnNames.substring(2)).append(")");
        sql.append(" VALUES (").append(placeholder.substring(2)).append(")");
    }
    return sql.toString();
}
Also used : JdbcBeanMetadata(cn.taketoday.jdbc.result.JdbcBeanMetadata) BeanProperty(cn.taketoday.beans.BeanProperty)

Example 15 with BeanProperty

use of cn.taketoday.beans.BeanProperty in project today-framework by TAKETODAY.

the class Dialect method delete.

public String delete(SQLParams sqlParams) {
    StringBuilder sql = new StringBuilder();
    sql.append("DELETE FROM ").append(sqlParams.getTableName());
    if (sqlParams.getConditionSQL().length() > 0) {
        sql.append(" WHERE ").append(sqlParams.getConditionSQL().substring(5));
    } else {
        if (null != sqlParams.getModel()) {
            StringBuilder columnNames = new StringBuilder();
            JdbcBeanMetadata beanMetadata = new JdbcBeanMetadata(sqlParams.getModelClass());
            for (BeanProperty property : beanMetadata) {
                Object value = property.getValue(sqlParams.getModel());
                if (value == null) {
                    continue;
                }
                columnNames.append(property.getName()).append(" = ? and ");
            }
            if (columnNames.length() > 0) {
                sql.append(" WHERE ").append(columnNames.substring(0, columnNames.length() - 5));
            }
        }
    }
    return sql.toString();
}
Also used : JdbcBeanMetadata(cn.taketoday.jdbc.result.JdbcBeanMetadata) BeanProperty(cn.taketoday.beans.BeanProperty)

Aggregations

BeanProperty (cn.taketoday.beans.BeanProperty)42 Test (org.junit.jupiter.api.Test)22 JdbcBeanMetadata (cn.taketoday.jdbc.result.JdbcBeanMetadata)8 BeanWrapperImpl (cn.taketoday.beans.BeanWrapperImpl)6 ArrayList (java.util.ArrayList)6 List (java.util.List)4 BeanMetadata (cn.taketoday.beans.BeanMetadata)2 NotWritablePropertyException (cn.taketoday.beans.NotWritablePropertyException)2 SimpleTypeConverter (cn.taketoday.beans.SimpleTypeConverter)2 TypeMismatchException (cn.taketoday.beans.TypeMismatchException)2 PropertyAccessor (cn.taketoday.core.reflect.PropertyAccessor)2 DataRetrievalFailureException (cn.taketoday.dao.DataRetrievalFailureException)2 InvalidDataAccessApiUsageException (cn.taketoday.dao.InvalidDataAccessApiUsageException)2 Method (java.lang.reflect.Method)2 ResultSet (java.sql.ResultSet)2 ResultSetMetaData (java.sql.ResultSetMetaData)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 Map (java.util.Map)2