设定bean类
public class TestAnnotation { /** The field descriptor map. * 返回由指定映射支持的同步(线程安全的)映射。为了保证按顺序访问,必须通过返回的映射完成所有对底层实现映射的访问 * 在返回映射的任意 collection 视图上进行迭代时,用户必须手工在返回的映射上进行同步 * */ private static Map<String, Map<String, FieldDescriptor>> fieldDescriptorMap = Collections.synchronizedMap(new HashMap<String, Map<String, FieldDescriptor>>()); @Column(name="id") private int id; @Column(name="name") private String name; @Column(name="age") private double age; @Column(name="birthday") private Date birthday; @Transient private String wifeName; 省略set和get方法 }
读取该类的属性,使用方法
public static List<PropertyMapping> mappingProperty(Class<?> clazz, boolean simpleType) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException { List<PropertyMapping> mappingList = new ArrayList<PropertyMapping>(); Map<String, FieldDescriptor> fieldMap = BeanUtils.getFieldDescriptors(clazz); if (fieldMap == null || fieldMap.isEmpty()) return mappingList; Collection<FieldDescriptor> fields = fieldMap.values(); // Field[] fields = clazz.getDeclaredFields(); // if ( fields==null || fields.length==0 ) return mappingList; Class<?> fieldClass = null; int modifier = 0; boolean isSimpleType = true; PropertyMapping mapping = null; Field field = null; for (FieldDescriptor f : fields) { field = f.getField(); fieldClass = field.getType(); // field.getModifiers():以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。应该使用 // Modifier 类对这些修饰符进行解码。 modifier = field.getModifiers(); if ((modifier & Modifier.FINAL) > 0 || (modifier & Modifier.NATIVE) > 0 || (modifier & Modifier.STATIC) > 0 || (modifier & Modifier.TRANSIENT) > 0 || (modifier & Modifier.VOLATILE) > 0) { continue; } isSimpleType = BaseUtils.isBaseType(fieldClass); if (simpleType && isSimpleType) { // 基本类型 mapping = fillBaseTypePropertyMapping(field); if (mapping != null) mappingList.add(mapping); } else if (!simpleType && !isSimpleType) { // 关联对象类型 mapping = fillComplexTypePropertyMapping(field); if (mapping != null) mappingList.add(mapping); } } return mappingList; }
判断类属性使用了匹配注解不,使用下列方法
/** * Fill base type property mapping. * * @param field * the field * @return the property mapping * @throws SQLException * the sQL exception */ private static PropertyMapping fillBaseTypePropertyMapping(Field field) throws SQLException { String propertyName = field.getName(); Class<?> fieldClass = field.getType(); PropertyMapping mapping = new PropertyMapping(); mapping.setPropertyName(propertyName); mapping.setPropertyClass(fieldClass); ColumnMapping columnMapping = new ColumnMapping(); mapping.setColumnMapping(columnMapping); Annotation annotation = null; // process for Column Annotation annotation = field.getAnnotation(Column.class); if (annotation != null) { String columnName = ((Column) annotation).name(); if (columnName == null || columnName.length() == 0) { columnName = getDefaultColumn(propertyName); } columnMapping.setColumnName(columnName); String alias = ((Column) annotation).alias(); if (alias != null && alias.length() > 0) { columnMapping.setAlias(alias); } } else { columnMapping.setColumnName(getDefaultColumn(propertyName)); } // process for Transient Annotation annotation = field.getAnnotation(Transient.class); if (annotation != null) { mapping.setTransientField(true); return mapping; } // process for Id Annotation annotation = field.getAnnotation(Id.class); if (annotation != null) { mapping.setPrimaryKey(true); int strategy = ((Id) annotation).strategy(); if (strategy == GenerationType.SEQUENCE) { String generator = ((Id) annotation).generator(); mapping.setGenerateStrategy(strategy); if (!StringUtils.isBlank(generator)) { mapping.setGenerator(generator); } } } // process for Clob Annotation annotation = field.getAnnotation(Clob.class); if (annotation != null) { if (!"java.lang.String".equals(fieldClass.getName())) throw new SQLException("Clob column must mapping to String. "); columnMapping.setLobType(LobType.CLOB); columnMapping.setLobLazy(((Clob) annotation).lazy()); } // process for Blob Annotation annotation = field.getAnnotation(Blob.class); if (annotation != null) { if (!"[B".equals(fieldClass.getName())) throw new SQLException("Blob column must mapping to byte[]"); columnMapping.setLobType(LobType.BLOB); columnMapping.setLobLazy(((Blob) annotation).lazy()); } annotation = field.getAnnotation(Search.class); if (annotation != null) { if (!((Search) annotation).exclude()) { ColumnSearch searchInfo = ColumnSearch .getDefaultInstance(fieldClass); searchInfo.setType(((Search) annotation).type()); searchInfo.setFetch(((Search) annotation).fetch()); searchInfo.setIgnoreValue(fieldClass.getName(), ((Search) annotation).ignoreValue()); columnMapping.setSearchInfo(searchInfo); } } if (columnMapping.getColumnName() == null) { columnMapping.setColumnName(getDefaultColumn(propertyName)); } return mapping; }
oneToMany 等
private static PropertyMapping fillComplexTypePropertyMapping(Field field) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException { String propertyName = field.getName(); Class<?> fieldClass = field.getType(); PropertyMapping mapping = new PropertyMapping(); mapping.setPropertyName(propertyName); mapping.setPropertyClass(fieldClass); Annotation transientAnnotation = field.getAnnotation(Transient.class); Annotation oneToOneAnnotation = field.getAnnotation(OneToOne.class); Annotation oneToManyAnnotation = field.getAnnotation(OneToMany.class); Annotation manyToManyAnnotation = field.getAnnotation(ManyToMany.class); Annotation idAnnotation = field.getAnnotation(Id.class); Annotation columnAnnotation = field.getAnnotation(Column.class); if (oneToOneAnnotation != null || oneToManyAnnotation != null || manyToManyAnnotation != null) { if (columnAnnotation == null) throw new SQLException( "must assign column for relation mapping"); String foreignColumn = ((Column) columnAnnotation).name(); if (StringUtils.isBlank(foreignColumn)) throw new SQLException( "Relation Type must asign column name for " + mapping.getPropertyName()); mapping.setForeignColumn(foreignColumn); mapping.setComplexType(false); if (oneToOneAnnotation != null) { String refColumn = ((OneToOne) oneToOneAnnotation) .referenceColumn(); boolean lazy = ((OneToOne) oneToOneAnnotation).lazy(); PropertyMapping refPropertyMapping = null; if (refColumn == null) { EntityMapping refEntityMapping = EntityMappingFactory .getEntityMapping(fieldClass); refPropertyMapping = refEntityMapping.getIdMapping(); refColumn = refPropertyMapping.getColumnName(); } mapping.setReloationType(RelationType.oneToOne); mapping.setReferenceClass(fieldClass); mapping.setReferenceColumn(refColumn); mapping.setLoadLazy(lazy); } else if (oneToManyAnnotation != null) { String refColumn = ((OneToMany) oneToManyAnnotation) .referenceColumn(); String orderBy = ((OneToMany) oneToManyAnnotation).orderBy(); boolean lazy = ((OneToMany) oneToManyAnnotation).lazy(); Type gType = field.getGenericType(); if (!(gType instanceof ParameterizedType)) { throw new SQLException( "OneToMany mapping must be a ParameterizedType. reference column=" + refColumn); } ParameterizedType pType = (ParameterizedType) gType; Class<?> rowClass = (Class<?>) pType.getRawType(); if (!"java.util.List".equals(rowClass.getName())) { throw new SQLException( "OneToMany mapping must be a List. reference column=" + refColumn); } Type[] args = pType.getActualTypeArguments(); if (args.length != 1) { throw new SQLException( "ParameterizedType must have a argument. OneToMany mapping reference column=" + refColumn); } Class<?> refClass = (Class<?>) args[0]; mapping.setReloationType(RelationType.oneToMany); mapping.setReferenceClass(refClass); mapping.setReferenceColumn(refColumn); mapping.setReferenceOrder(orderBy); mapping.setLoadLazy(lazy); } else { String refColumn = ((ManyToMany) manyToManyAnnotation) .referenceColumn(); String orderBy = ((ManyToMany) manyToManyAnnotation).orderBy(); String relationTable = ((ManyToMany) manyToManyAnnotation) .relationTable(); String relationRefCol1 = ((ManyToMany) manyToManyAnnotation) .relationRefColumn1(); String relationRefCol2 = ((ManyToMany) manyToManyAnnotation) .relationRefColumn2(); boolean lazy = ((ManyToMany) manyToManyAnnotation).lazy(); Type gType = field.getGenericType(); if (!(gType instanceof ParameterizedType)) { throw new SQLException( "ManyToMany mapping must be a ParameterizedType. reference column=" + refColumn); } ParameterizedType pType = (ParameterizedType) gType; Class<?> rowClass = (Class<?>) pType.getRawType(); if (!"java.util.List".equals(rowClass.getName())) { throw new SQLException( "MayToMany mapping must be a collection. reference column=" + refColumn); } Type[] args = pType.getActualTypeArguments(); if (args.length != 1) { throw new SQLException( "ParameterizedType must have a argument. ManyToMany mapping reference column=" + refColumn); } Class<?> refClass = (Class<?>) args[0]; mapping.setReloationType(RelationType.manyToMany); mapping.setReferenceClass(refClass); mapping.setReferenceColumn(refColumn); mapping.setReferenceOrder(orderBy); mapping.setRelationTable(relationTable); mapping.setRelationRefCol1(relationRefCol1); mapping.setRelationRefCol2(relationRefCol2); mapping.setLoadLazy(lazy); } } else { if (!EntityUtils.isEntity(fieldClass)) { return null; } mapping.setComplexType(true); if (transientAnnotation != null) { mapping.setTransientField(true); } else if (idAnnotation != null) { mapping.setPrimaryKey(true); } ObjectMapping objectMapping = EntityMappingFactory .loadObjectMapping(fieldClass); mapping.setObjectMapping(objectMapping); for (PropertyMapping pm : objectMapping.getPropertyMap().values()) { pm.setPrimaryKey(mapping.isPrimaryKey()); pm.setTransientField(mapping.isTransientField()); } } return mapping; }