- 浏览: 58343 次
- 性别:
- 来自: 成都
文章分类
最新评论
实现类似于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; } }
发表评论
-
读Objects源码
2018-06-17 14:02 306//该类是一个工具类,主要封装了对对象的equals,hash ... -
读java Optional 源码
2018-06-01 20:00 354//该类是jdk1.8新增的类,主要是为了解决NPE问题。 ... -
读AbstractStringBuilder源码
2017-10-16 16:56 321//该类是StringBuilder和StringBuff ... -
读String源码
2017-10-16 15:17 436//先看构造函数 public String() { ... -
java编译编码问题
2017-10-02 11:35 330最近由一个编码问题。让我对另一个编码问题产生了疑惑。 即我们在 ... -
在java服务端设置允许跨域请求
2017-08-29 10:58 2576//写一个filter对response进行过滤 pub ... -
java从数据库中查出来二次封装基于注解
2018-03-05 22:33 500实现类似于mybatis一对多关系和一对一关系: 上代码: ... -
对abstract关键字的另一番理解
2017-03-22 16:10 235直接上代码: public abstract class An ... -
JVM垃圾回收历史
2017-02-17 16:30 285从网上看到一篇文章讲述垃圾回收的历史搬运过来: 为什么要有G ... -
看String源码的疑惑
2016-10-21 15:27 388今天看JDK String 源码有一段代码实在没想通,网上也没 ... -
java final关键字
2016-10-09 22:03 299final关键字的主要用于申明这个东西是不可变的。用于设计以及 ... -
java for each循环的原理
2016-10-09 21:18 422这篇介绍java for each原理的文章写的很棒,转过来m ... -
关于java内部类
2016-10-09 21:10 246关于java内部类,这篇文章写的非常好。尊重作者的劳动成果: ... -
java static关键字的作用
2016-10-05 17:23 223static关键字的设计初衷,套用thinking in ja ... -
关于反射泛型的封装
2016-09-11 16:16 390最近用到了jackson转json。看了下TypeRefere ... -
java到底是按照值传递还是引用传递
2016-07-25 19:45 359public class Transfer { pub ...
相关推荐
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
1.commons-beanutils.jar...12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。 13.commons-Email.jar: 提供开源的API
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...
基于Springboot+ Shiro+mybatis+Thymeleaf+Bootstra的Java后台管理系统脚手架.zip 1.JAVA后台管理系统,企业...15.系统高度扩展扩展性好,非常适合二次开发。 16.涵盖Java Web主流前沿技术,既适合刚入坑的IT菜鸟。
mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 使用了layui的弹出层、菜单、文件上传、富文本编辑、日历、选项卡、数据表格等 表单数据采用bootstrapValidator校验,简单快捷方便...
J SP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻 辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻 辑与网页设计和显示分离,支持可重用的基于...