`

java从数据库中查出来二次封装基于注解

    博客分类:
  • java
阅读更多
实现类似于mybatis一对多关系和一对一关系:

上代码:
/**
 * @author 
 * @version 创建时间:2017年3月23日 上午11:01:39
 * @description 定义1对多关系注解 value代表要发射的字段名
 */
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Association {
	String[] value() default {};
}

/** 
* @author 
* @version 创建时间:2017年3月22日 下午4:23:00 
* @description 定义1对多关系注解 value代表要发射的字段名
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Collection {
	String[] value() default {};
}

/** 
* @author 
* @version 创建时间:2017年3月23日 上午11:09:12 
* @description 封装注解对应的实体类中要反射的字段
*/
public class PropertyMapping {
	private String property;
	private String javaType;
	private List<PropertyMapping> propertyMappings;
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
	}
	public String getJavaType() {
		return javaType;
	}
	public void setJavaType(String javaType) {
		this.javaType = javaType;
	}
	public List<PropertyMapping> getPropertyMappings() {
		return propertyMappings;
	}
	public void setPropertyMappings(List<PropertyMapping> propertyMappings) {
		this.propertyMappings = propertyMappings;
	}
	
}


/**
 * @author 
 * @version 创建时间:2017年3月23日 上午11:16:57
 * @description 扫描注解封装到ProperMapping
 */
public abstract class AnnotationScan<T> implements Comparable<AnnotationScan<T>> {
	Type _type;
	private boolean nest;
	
	public AnnotationScan() {
		Type superClass = getClass().getGenericSuperclass();// 获取该类的直接超类
		_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
	}

	public Type get_type() {
		return _type;
	}
	
	public boolean isNest() {
		return nest;
	}

	public List<PropertyMapping> getMappings() {
		List<PropertyMapping> lists = new ArrayList<PropertyMapping>();
		PropertyMapping mapping = getFieldByAnnotion(((Class<? extends AnnotationScan>) get_type()),Collection.class);
		PropertyMapping amapping = getFieldByAnnotion(((Class<? extends AnnotationScan>) get_type()),Association.class);
		if(mapping!=null){
			lists.add(mapping);
			nest = true;
		}
		if(amapping!=null){
			lists.add(amapping);
		}
		return lists;
	}
	
	private PropertyMapping getFieldByAnnotion(Class<?> t, Class<? extends Annotation> annotion) {
		Class<?> clazz = null;
		Field[] fields = t.getDeclaredFields();
		PropertyMapping mapping = null;
		for (Field field : fields) {
			if (field.isAnnotationPresent(annotion)) {
				List<PropertyMapping> mmappings = null;
				Annotation annotation = field.getAnnotation(annotion);
				String[] sfields = null;
				if (annotation instanceof Collection) {
					clazz = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
					Collection collection = (Collection) annotation;
					sfields = collection.value();
				} else if (annotation instanceof Association) {
					clazz = field.getType();
					Association association = (Association) annotation;
					sfields = association.value();
				}
				if (sfields == null || sfields.length == 0) {
					sfields = getAllFields(clazz);
				}
				mmappings = getPropertyMappings(sfields);
				mapping = new PropertyMapping();
				mapping.setJavaType(clazz.getName());
				mapping.setProperty(field.getName());
				mapping.setPropertyMappings(mmappings);
			}
		}
		return mapping;
	}

	private List<PropertyMapping> getPropertyMappings(String[] sfields) {
		List<PropertyMapping> list = new ArrayList<PropertyMapping>();
		PropertyMapping mapping;
		for (String s : sfields) {
			mapping = new PropertyMapping();
			mapping.setProperty(s);
			list.add(mapping);
		}
		return list;
	}

	private String[] getAllFields(Class nestClass) {
		Field[] fields = nestClass.getDeclaredFields();
		List<String> lists = new ArrayList<String>();
		for (Field field : fields) {
			lists.add(field.getName());
		}
		return lists.toArray(new String[lists.size()]);
	}
	@Override
	public int compareTo(AnnotationScan<T> o) {
		return 0;
	}
	/*public static void main(String[] args) {
		AnnotationScan<ProductDetailEntity> annotationScan = new AnnotationScan<ProductDetailEntity>(){};
		List<PropertyMapping> lists;
		try {
			lists = annotationScan.getMappings();
			System.out.println(lists);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}*/
}


/**
 * @author 
 * @version 创建时间:2017年3月22日 下午3:39:01
 * @param <T>
 * @param <E>
 * @description 封装数据
 */
public  class AnnotionMapping<T> {
	private AnnotationScan<T> annotationScan;
	private Map<String, List<Object>> maps = new HashMap<String, List<Object>>();
	private String id;
	public AnnotionMapping(AnnotationScan<T> annotationScan,String id){
		this.annotationScan = annotationScan;
		this.id = id;
	}
	
	public  <E> List<T> getBeans(List<E> sourceList) {
		
		List<T> targerObjects = new ArrayList<T>();
		
		List<PropertyMapping> propertyMappings = annotationScan.getMappings();
		
		try {
			
			String pvalue;
			
			List<T> dataList = new ArrayList<T>();
			T targetObject = null;
			List<Object> composites;


			for (E e : sourceList) {
				pvalue = getValue(id, e).toString();
				if (!maps.containsKey(pvalue)) {
					targetObject = (T) ((Class<? extends AnnotationScan<T>>)annotationScan.get_type()).newInstance();
					BeanUtils.copyProperties(e, targetObject);
					// composites = new ArrayList<Object>();
					setData(targetObject, e, propertyMappings);
					// maps.put(getValue(id, t).toString(), composites);
					dataList.add(targetObject);
				} else if (annotationScan.isNest()) {
					composites = maps.get(pvalue);
					composites = setComposites(composites, e, propertyMappings);
				}
				/*
				 * else { composites = maps.get(getValue(id, t)); composites =
				 * setComposites(composites, t, resultSetMappings); }
				 */
			}

			return dataList;
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return targerObjects;
	}

	private <E> List<Object> setComposites(List<Object> composites, E obj, List<PropertyMapping> propertyMappings) {
		String javaType;
		T object;
		List<PropertyMapping> compositesMappings;
		for (PropertyMapping mapping : propertyMappings) {
			javaType = mapping.getJavaType();
			if (javaType != null) {
				try {
					object = (T) Class.forName(javaType).newInstance();
					compositesMappings = mapping.getPropertyMappings();
					setData(object, obj, compositesMappings);
					composites.add(object);
					return composites;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}

	private  <E> void setData(T targetObject, E e, List<PropertyMapping> propertyMappings) {
		String property;
		String javaType;
		Object value;
		Object object;
		// Object nestObject;
		List<Object> composites;
		for (PropertyMapping mapping : propertyMappings) {
			property = mapping.getProperty();
			javaType = mapping.getJavaType();
			if (javaType == null) {
				value = getValue(property, e);
				setValue(value, property, targetObject);
			} else {
				try {
					// nestObject = getValue(property, targetObject);
					Field field = targetObject.getClass().getDeclaredField(property);
					if (field.getType().isAssignableFrom(List.class)) {
						composites = maps.get(getValue(id, e));
						if (composites == null) {
							composites = new ArrayList<Object>();
							maps.put(getValue(id, e).toString(), composites);
						}
						composites = setComposites(composites, e, propertyMappings);
						setValue(composites, property, targetObject);
					} else {
						object = Class.forName(javaType).newInstance();
						setAssociation(object, e, mapping.getPropertyMappings());
						setValue(object, property, targetObject);
					}
				} catch (Exception e1) {
				}
			}
		}

	}

	private void setAssociation(Object nestObject, Object obj, List<PropertyMapping> list) {
		String property;
		Object value;
		for (PropertyMapping mapping : list) {
			property = mapping.getProperty();
			value = getValue(property, obj);

			setValue(value, property, nestObject);
		}
	}

	private <E> void setValue(Object value, String property, E obj) {
		try {
			Field field = obj.getClass().getDeclaredField(property);
			field.setAccessible(true);
			field.set(obj, value);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Object getValue(String property, Object obj) {
		try {
			Field field = obj.getClass().getDeclaredField(property);
			field.setAccessible(true);
			return field.get(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
	
	
	
}


分享到:
评论

相关推荐

    对Hibernate框架的二次封装,简化对数据库的操作

    在给出的压缩包文件"hoaven-boot-libdbjpa-master"中,可能包含了这样一个已经二次封装好的Hibernate库,它可能集成了Spring Boot,提供了基于JPA(Java Persistence API)的简单易用的数据库操作API。开发者可以...

    ORMLite框架二次封装工具类

    总的来说,"ORMLite框架二次封装工具类"是一个高效的解决方案,它降低了Android应用中数据库操作的复杂度,提高了代码的可读性和可维护性。通过学习和使用这样的工具类,开发者可以更加专注于业务逻辑,而不是基础的...

    基于Java web SSM框架的权限管理系统(源码+数据库).zip

    这个系统提供了源码,方便开发者进行学习和二次开发。下面将详细讲解该系统的组成部分和实现技术。 1. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了一个容器来管理对象的生命周期和依赖关系。在这...

    基于java的连连看游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+辅导视频).zip

    Java是一种面向对象的、跨平台的编程语言,其“一次编写,到处运行”的特性使其在游戏开发中具有显著优势。在连连看游戏中,Java用于处理游戏逻辑、用户交互、图形渲染等多个方面。例如,Java Swing或JavaFX库可以...

    GreenDao 封装

    虽然GreenDao提供了基本的数据操作接口,但为了适应不同的业务场景,往往需要对其进行二次封装,以实现更符合项目需求的API,如批量操作、事务处理、自定义查询等。封装后的GreenDao模块可以提高代码的可读性和可...

    Mybatis通用DAO设计封装(mybatis)

    Mybatis通用DAO设计封装主要涉及的是在Java开发中如何高效地使用Mybatis框架进行数据库操作。Mybatis是一款轻量级的持久层框架,它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过提供自定义SQL、存储...

    Java分页技术+数据库

    2. **MyBatis分页**:MyBatis是一个流行的持久层框架,它允许在Mapper XML文件或注解中直接写SQL,支持动态SQL,分页插件如PageHelper可以简化分页逻辑。配置好插件后,只需在查询方法上添加Page对象,MyBatis会自动...

    java二次上传

    在Java编程领域,"二次上传"通常指的是用户在一次上传文件后,可能需要对已上传的文件进行修改或更新,然后再次上传的过程。这个过程涉及到多个关键知识点,包括文件操作、HTTP请求、服务器端处理以及安全性考虑。...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    它是对数据库的配置和映射信息的封装,通常在应用启动时创建一次,然后在整个应用生命周期内复用。 5. **Criteria查询**:Hibernate提供了Criteria API,允许以面向对象的方式进行数据库查询,无需编写SQL语句。...

    java的ssm框架的完整项目

    本项目基于SSM框架构建了一个完整的小型应用程序,适合初学者进行学习或者开发者进行二次开发。以下是关于SSM框架及其在该项目中的应用的详细知识点: 1. **Spring框架**:Spring是Java企业级应用的核心框架,它...

    【中文】【 JAVA快速查询手册 】【pdf】【8.74 MB】

    Java的设计目标是实现一次编写,到处运行(Write Once, Run Anywhere, WORA)的理念,这意味着编写的Java程序可以在所有支持Java的平台上运行而无需重新编译。Java语言具有简单性、面向对象、健壮性、安全性、平台...

    java开源包4

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包6

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包9

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包101

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包5

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包8

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包10

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    可二次开发springmvc实现登陆

    Spring MVC 是一款强大的Java Web开发框架,由Spring公司推出,用于构建基于模型-视图-控制器(MVC)模式的Web应用程序。它提供了一个灵活的架构,帮助开发者将业务逻辑与用户界面分离,使得开发过程更加高效且易于...

    java从入门到精通第一章到底二十四章

    "Java从入门到精通第一章到底二十四章"这个教程涵盖了从基础到进阶的全方位Java知识,旨在为初学者提供一个系统的学习路径。 首先,第一章通常会介绍Java的历史、特点和应用领域,以及为什么选择Java作为学习对象。...

Global site tag (gtag.js) - Google Analytics