`

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

    博客分类:
  • java
阅读更多
实现类似于mybatis的配置关系一对多或者一对一的实现:基于<XML>实现:
先上个配置文件
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper>

	<resultMap ID="manyMap" type="com.zfsy.entity.ProductDetailEntity">
		<id property="xh" column="xh"/>
		<result property="spmc" column="spmc"/>
		<result property="dj" column="dj"/>
		<result property="sppj" column="sppj"/>
		<result property="dw" column="dw"/>
		<result property="spms" column="spms"/>
		<collection property="images" ofType="com.zfsy.entity.ImageUrl">
			<!-- <id property="xh" column="bxh"/> -->
			<result property="lx" column="lx"/>
			<result property="tpurl" column="tpurl"/>
		</collection>
		 <association property="goodsType" ofType="com.stark.app.model.GoodsType">
			<id property="xh" column="cxh"/>
			<result property="mc" column="mc"/>
			<result property="ico" column="ico"/>
		</association>  
	</resultMap>

</mapper>

/** 
* @author 
* @version 创建时间:2017年3月20日 下午3:19:04 
* @description 对应xml中resultMap下的一条条记录
*/
public class ResultSetMapping {
	private String property;
	private String column;
	//private String collectionType;
	private String javaType;
	//对应collection和association标签下的result
	private List<ResultSetMapping> composites;
	
	/*public String getCollectionType() {
		return collectionType;
	}
	public void setCollectionType(String collectionType) {
		this.collectionType = collectionType;
	}*/
	public List<ResultSetMapping> getComposites() {
		return composites;
	}
	public void setComposites(List<ResultSetMapping> composites) {
		this.composites = composites;
	}
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
	}
	public String getColumn() {
		return column;
	}
	public void setColumn(String column) {
		this.column = column;
	}
	public String getJavaType() {
		return javaType;
	}
	public void setJavaType(String javaType) {
		this.javaType = javaType;
	}
	
}


/** 
* @author 
* @version 创建时间:2017年3月20日 下午5:03:09 
* @description 对应整个resultMap配置文件的一些关键信息
*/
public class ResultMapper {
	private String id;
	private String classType;
	private List<ResultSetMapping> rsMapping;
	private boolean hasNest;
	
	public boolean isHasNest() {
		return hasNest;
	}
	public void setHasNest(boolean hasNest) {
		this.hasNest = hasNest;
	}
	public ResultMapper(String id, String classType, List<ResultSetMapping> rsMapping) {
		super();
		this.id = id;
		this.classType = classType;
		this.rsMapping = rsMapping;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassType() {
		return classType;
	}
	public void setClassType(String classType) {
		this.classType = classType;
	}
	public List<ResultSetMapping> getRsMapping() {
		return rsMapping;
	}
	public void setRsMapping(List<ResultSetMapping> rsMapping) {
		this.rsMapping = rsMapping;
	}
	
}

/**
 * @author 
 * @version 创建时间:2017年3月20日 下午3:37:17
 * @description 读取配置文件 封装数据到resultMapper
 */
public class Configuration {
	public ResultMapper loadXml(String path, String mapId) {
		SAXReader saxReader = new SAXReader();
		List<ResultSetMapping> mappings = new ArrayList<ResultSetMapping>();
		try {
			Document document = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(path));
			Element element = document.getRootElement();
			Element node = element.elementByID(mapId);
			mappings = configMappings(node, mappings);
			ResultMapper mapper = new ResultMapper(node.element("id").attributeValue("property"), node.attributeValue("type"), mappings);
			if(node.element("collection")!=null){
				mapper.setHasNest(true);
			}
			return mapper;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	private List<ResultSetMapping> configMappings(Element node, List<ResultSetMapping> mappings2) {
		ResultSetMapping resultSetMapping;
		ResultSetMapping cresultSetMapping;
		List<ResultSetMapping> cResultSetMapping;
		List<Element> elements = node.elements();
		for (Element element : elements) {
			resultSetMapping = new ResultSetMapping();
			if (element.getName().equals("collection")||element.getName().equals("association")){
				// resultSetMapping.setColumn(element.attributeValue("column"));
				cResultSetMapping = new ArrayList<ResultSetMapping>();
				resultSetMapping.setJavaType(element.attributeValue("ofType"));
				List<Element> celements = element.elements();

				for (Element element2 : celements) {
					cresultSetMapping = new ResultSetMapping();
					cresultSetMapping.setColumn(element2.attributeValue("column"));
					cresultSetMapping.setProperty(element2.attributeValue("property"));
					cResultSetMapping.add(cresultSetMapping);
				}
				resultSetMapping.setComposites(cResultSetMapping);
			} 
			resultSetMapping.setColumn(element.attributeValue("column"));
			resultSetMapping.setProperty(element.attributeValue("property"));
			mappings2.add(resultSetMapping);
		}
		return mappings2;
	}

}

/**
 * @author 
 * @version 创建时间:2017年3月20日 下午5:13:53
 * @description 组装数据
 */
public class BeanFactory {
	private Map<String, List<Object>> maps = new HashMap<String, List<Object>>();
	
	private String id;

	@SuppressWarnings("unchecked")
	public <T, E> List<E> getBeans(List<T> lists, ResultMapper resultMapper) {

		try {

			// Map<String, Object> objectMap = new HashMap<String, Object>();
			List<E> dataList = new ArrayList<E>();
			String id = resultMapper.getId();
			this.id = id;
			E targetObject = null;
			List<Object> composites;

			List<ResultSetMapping> resultSetMappings = resultMapper.getRsMapping();

			for (T t : lists) {

				if (!maps.containsKey(getValue(id, t))) {
					targetObject = (E) Class.forName(resultMapper.getClassType()).newInstance();
					// composites = new ArrayList<Object>();
					setData(targetObject, t, resultSetMappings);
					// maps.put(getValue(id, t).toString(), composites);
					dataList.add(targetObject);
				} else if (resultMapper.isHasNest()) {
					composites = maps.get(getValue(id, t));
					composites = setComposites(composites, t, resultSetMappings);
				}
				/*
				 * else { composites = maps.get(getValue(id, t)); composites =
				 * setComposites(composites, t, resultSetMappings); }
				 */
			}

			return dataList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

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

	private <E> void setData(E targetObject, Object obj, List<ResultSetMapping> resultSetMappings) {
		String property;
		String javaType;
		Object value;
		Object object;
		String column;
		// Object nestObject;
		List<Object> composites;
		for (ResultSetMapping mapping : resultSetMappings) {
			property = mapping.getProperty();
			javaType = mapping.getJavaType();
			column = mapping.getColumn();
			if (javaType == null) {
				value = getValue(column, obj);
				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, obj));
						if (composites == null) {
							composites = new ArrayList<Object>();
							maps.put(getValue(id, obj).toString(), composites);
						}
						composites = setComposites(composites, obj, resultSetMappings);
						setValue(composites, property, targetObject);
					} else {
						object = Class.forName(javaType).newInstance();
						setAssociation(object, obj, mapping.getComposites());
						setValue(object, property, targetObject);
					}
				} catch (Exception e) {
				}
			}
		}

	}

	private void setAssociation(Object nestObject, Object obj, List<ResultSetMapping> composites) {
		String property;
		Object value;
		String column;
		for (ResultSetMapping mapping : composites) {
			property = mapping.getProperty();
			column = mapping.getColumn();
			value = getValue(column, 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;
	}
}




分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java开源包11

    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开源包4

    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的...

    java开源包1

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

    java开源包3

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

    Java开发常用jar包

    1.commons-beanutils.jar...12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。 13.commons-Email.jar: 提供开源的API

    java开源包2

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

    java开源包7

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

    Java资源包01

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

    基于Springboot+ Shiro+mybatis+Thymeleaf+Bootstra的Java后台管理系统脚手架.zip

    基于Springboot+ Shiro+mybatis+Thymeleaf+Bootstra的Java后台管理系统脚手架.zip 1.JAVA后台管理系统,企业...15.系统高度扩展扩展性好,非常适合二次开发。 16.涵盖Java Web主流前沿技术,既适合刚入坑的IT菜鸟。

    基于Springboot+Mybatis+ SpringMvc+springsecrity+Redis完整网站后台管理系统

    mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 使用了layui的弹出层、菜单、文件上传、富文本编辑、日历、选项卡、数据表格等 表单数据采用bootstrapValidator校验,简单快捷方便...

    基于JAVA的留言板管理系统的毕业设计.doc

    J SP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻 辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻 辑与网页设计和显示分离,支持可重用的基于...

Global site tag (gtag.js) - Google Analytics