- 浏览: 62285 次
- 性别:
- 来自: 成都
文章分类
最新评论
实现类似于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; } }
发表评论
-
读Objects源码
2018-06-17 14:02 328//该类是一个工具类,主要封装了对对象的equals,hash ... -
读java Optional 源码
2018-06-01 20:00 382//该类是jdk1.8新增的类,主要是为了解决NPE问题。 ... -
读AbstractStringBuilder源码
2017-10-16 16:56 346//该类是StringBuilder和StringBuff ... -
读String源码
2017-10-16 15:17 460//先看构造函数 public String() { ... -
java编译编码问题
2017-10-02 11:35 355最近由一个编码问题。让我对另一个编码问题产生了疑惑。 即我们在 ... -
在java服务端设置允许跨域请求
2017-08-29 10:58 2619//写一个filter对response进行过滤 pub ... -
java从数据库中查出来二次封装基于XML
2018-03-05 22:22 315实现类似于mybatis的配置关系一对多或者一对一的实现:基于 ... -
对abstract关键字的另一番理解
2017-03-22 16:10 260直接上代码: public abstract class An ... -
JVM垃圾回收历史
2017-02-17 16:30 319从网上看到一篇文章讲述垃圾回收的历史搬运过来: 为什么要有G ... -
看String源码的疑惑
2016-10-21 15:27 416今天看JDK String 源码有一段代码实在没想通,网上也没 ... -
java final关键字
2016-10-09 22:03 328final关键字的主要用于申明这个东西是不可变的。用于设计以及 ... -
java for each循环的原理
2016-10-09 21:18 453这篇介绍java for each原理的文章写的很棒,转过来m ... -
关于java内部类
2016-10-09 21:10 269关于java内部类,这篇文章写的非常好。尊重作者的劳动成果: ... -
java static关键字的作用
2016-10-05 17:23 257static关键字的设计初衷,套用thinking in ja ... -
关于反射泛型的封装
2016-09-11 16:16 429最近用到了jackson转json。看了下TypeRefere ... -
java到底是按照值传递还是引用传递
2016-07-25 19:45 392public class Transfer { pub ...
相关推荐
在给出的压缩包文件"hoaven-boot-libdbjpa-master"中,可能包含了这样一个已经二次封装好的Hibernate库,它可能集成了Spring Boot,提供了基于JPA(Java Persistence API)的简单易用的数据库操作API。开发者可以...
总的来说,"ORMLite框架二次封装工具类"是一个高效的解决方案,它降低了Android应用中数据库操作的复杂度,提高了代码的可读性和可维护性。通过学习和使用这样的工具类,开发者可以更加专注于业务逻辑,而不是基础的...
这个系统提供了源码,方便开发者进行学习和二次开发。下面将详细讲解该系统的组成部分和实现技术。 1. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了一个容器来管理对象的生命周期和依赖关系。在这...
Java是一种面向对象的、跨平台的编程语言,其“一次编写,到处运行”的特性使其在游戏开发中具有显著优势。在连连看游戏中,Java用于处理游戏逻辑、用户交互、图形渲染等多个方面。例如,Java Swing或JavaFX库可以...
虽然GreenDao提供了基本的数据操作接口,但为了适应不同的业务场景,往往需要对其进行二次封装,以实现更符合项目需求的API,如批量操作、事务处理、自定义查询等。封装后的GreenDao模块可以提高代码的可读性和可...
Mybatis通用DAO设计封装主要涉及的是在Java开发中如何高效地使用Mybatis框架进行数据库操作。Mybatis是一款轻量级的持久层框架,它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过提供自定义SQL、存储...
2. **MyBatis分页**:MyBatis是一个流行的持久层框架,它允许在Mapper XML文件或注解中直接写SQL,支持动态SQL,分页插件如PageHelper可以简化分页逻辑。配置好插件后,只需在查询方法上添加Page对象,MyBatis会自动...
在Java编程领域,"二次上传"通常指的是用户在一次上传文件后,可能需要对已上传的文件进行修改或更新,然后再次上传的过程。这个过程涉及到多个关键知识点,包括文件操作、HTTP请求、服务器端处理以及安全性考虑。...
它是对数据库的配置和映射信息的封装,通常在应用启动时创建一次,然后在整个应用生命周期内复用。 5. **Criteria查询**:Hibernate提供了Criteria API,允许以面向对象的方式进行数据库查询,无需编写SQL语句。...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
本项目基于SSM框架构建了一个完整的小型应用程序,适合初学者进行学习或者开发者进行二次开发。以下是关于SSM框架及其在该项目中的应用的详细知识点: 1. **Spring框架**:Spring是Java企业级应用的核心框架,它...
Java的设计目标是实现一次编写,到处运行(Write Once, Run Anywhere, WORA)的理念,这意味着编写的Java程序可以在所有支持Java的平台上运行而无需重新编译。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的...
Spring MVC 是一款强大的Java Web开发框架,由Spring公司推出,用于构建基于模型-视图-控制器(MVC)模式的Web应用程序。它提供了一个灵活的架构,帮助开发者将业务逻辑与用户界面分离,使得开发过程更加高效且易于...