`
01jiangwei01
  • 浏览: 543157 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 读取类映射

    博客分类:
  • java
 
阅读更多

设定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;
	}

 

 

分享到:
评论

相关推荐

    mysql表映射成java实体类

    MySQL是一种广泛使用的开源关系型数据库管理系统,而Java实体类则是将数据库表结构映射到编程语言中的对象,便于进行对象关系映射(ORM)。本话题将详细介绍如何通过原生JDBC连接MySQL数据库,自动获取所有表名并...

    java 利用内存映射读取文件后 按行进行输出

    java利用内存映射读取大文件。并且捉行输出。

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    在Java编程中,XML(eXtensible Markup Language)是一种常用的数据交换格式,常用于存储配置信息或数据映射。本程序集的核心是利用Java解析XML文件,将XML中的数据映射到数据库,并通过反射机制进行数据库操作。...

    MongoDB、Java与对象关系映射

    ### MongoDB、Java与对象关系映射 #### MongoDB简介与特性 MongoDB作为一种强大的NoSQL数据库,在处理非结构化数据方面有着显著的优势。它通过使用JSON(JavaScript Object Notation)格式来存储和检索数据,简化...

    Mysql映射java实体类

    将MySQL中的表映射到Java实体类是一种常见的做法,它使得开发者可以通过对象的方式来操作数据库,大大提高了开发效率。这个压缩包文件可能包含了一个示例,展示了如何将MySQL的表结构映射为Java类。 首先,我们要...

    xml与java对象映射

    - **Maven Plugins**:如maven-jaxb2-plugin,用于自动生成Java类,这些类可以直接映射到XML schema。 - **IDE集成**:Eclipse和IntelliJ IDEA等IDE提供XML到Java对象的绑定功能,简化开发过程。 4. **自定义映射...

    读取数据库类写成java类

    在Java编程中,读取数据库并将其...总的来说,"读取数据库类写成java类"涉及了Java的数据库连接、SQL查询、结果集处理、对象映射以及面向对象的属性读写。理解这些概念对于开发与数据库交互的Java应用程序至关重要。

    java 端口映射源码jPortMap.zip

    在Java中,我们主要使用`java.net`包下的类来实现端口映射。这些类包括`ServerSocket`、`Socket`、`DatagramSocket`等。`ServerSocket`用于监听特定端口的连接请求,而`Socket`则用于建立客户端和服务端的连接。在...

    自动生成java实体类和映射文件

    读取mysql数据库,创建所有的Entity实体类,实体类里面有对应的注释,数据库的comment会作为字段的注释。 生成dao文件以及对应的mapper.xml文件,这是为了mybaits准备的。 mapper.xml文件里面配置了resultMap,实现...

    映射 SQL 和 Java 类型

    在 Java 应用程序中使用 JDBC 访问数据库时,需要将 SQL 数据类型映射到 Java 类型,以便在 Java 应用程序和数据库之间读写数据。JDBC 提供了 getXXX 和 setXXX 方法集、registerOutParameter 方法和 Types 类来实现...

    MySQL表自动生成Java实体类

    Java实体类(Entity Class)作为数据模型的表示,与数据库中的表进行映射,使得开发者能够更方便地操作数据库。本主题主要讲解如何利用工具或自定义脚本将MySQL数据表自动生成对应的Java实体类,提高开发效率。 ...

    Java NIO 应用使用内存映射文件实现进程间通信

    2. `ReadShareMemory.java` 类则负责读取映射文件中的数据。同样,通过`RandomAccessFile`打开文件并获取`FileChannel`,然后映射文件到内存中。读取数据时,检查状态标记,根据标记确定是否可以读取,然后读取并...

    使用 Spring LDAP 读取数据并映射到 Java Bean 中

    这篇博客文章“使用 Spring LDAP 读取数据并映射到 Java Bean 中”主要探讨了如何通过Spring LDAP来查询LDAP目录信息,并将查询结果转换为Java对象,以便在应用程序中进一步处理。 首先,`pom.xml`文件是Maven项目...

    自动生成java实体类和mybatis映射文件

    读取mysql数据库,创建所有的Entity实体类,实体类里面有对应的注释,数据库的comment会作为字段的注释。 生成dao文件以及对应的mapper.xml文件,这是为了mybaits准备的。 mapper.xml文件里面配置了resultMap,实现...

    USB-IC读写器Java_Jna示例源码.rar

    标题 "USB-IC读写器Java_Jna示例源码.rar" 提供的是一个使用Java通过JNA(Java Native Access)技术调用DLL动态库来读写IC卡的示例项目。这个项目主要关注的是在Java环境中实现对IC卡,如MIFARE One卡的读写操作,这...

    映射目录为磁盘的工具(含源码java)

    如果这是一个Java程序,通常包含一个主类,该类包含运行程序所需的逻辑,包括但不限于读取文件夹路径,查找可用盘符,以及创建并绑定文件夹与选定盘符的映射关系。 对于这类工具的工作原理,一般会涉及以下几个关键...

    Java读取json文件,并转化为map取值

    本教程将深入讲解如何使用Java读取JSON文件,并将其内容转化为Map以便进行取值操作。 首先,我们需要引入处理JSON的库。Java标准库并不直接支持JSON操作,所以我们通常会使用第三方库,如`org.json`或`...

    Java读取解析GRIB2文件

    以上就是使用Java读取和解析GRIB2文件的基本步骤和涉及的关键技术。实际应用中,你可能还需要根据具体需求进行数据处理、统计分析或集成到更大的系统中。学习和理解GRIB2格式以及选择合适的库是成功处理这些文件的...

    java读取kml文件数据

    1. 加载KML文件:使用Java的FileInputStream类打开文件,然后通过JAXBContext创建一个上下文,以便将XML数据映射到Java对象。 2. 解析KML文件:使用Unmarshaller接口从KML文件中生成对应的Java对象模型。 3. 遍历KML...

    hdf5文件结构以及基于java的读写

    ### HDF5 文件结构以及基于 Java 的读写 #### HDF 概述 HDF(Hierarchical Data Format)是一种自我描述、多对象的文件格式,专为高效地存储和分发科学数据而设计。它由美国国家超级计算应用中心(NCSA)开发,...

Global site tag (gtag.js) - Google Analytics