java从数据库中查出来二次封装基于XML
程序员文章站
2022-03-19 10:52:02
...
实现类似于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; } }
上一篇: 在解决ul居中问题时想到的几点_经验交流
下一篇: spring之BeanNameAware