首页 > 代码库 > Java注解应用,自定义注解映射实现方案说明.
Java注解应用,自定义注解映射实现方案说明.
插件结构如图:
注册模块定义了三个:用于实体与表映射的注解,用于属性到表字段的映射,用于映射时过滤掉的注解.
1.用于实体与表映射的注解
package com.dobby.plugins.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * User: 苏若年 * Date: 14-10-9 * Time: 下午21:12 * Description: */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface GeneratorTable { //标注映射时的表名 public String name() default "";}
2.用于属性与字段映射的注解
package com.dobby.plugins.annotation;import java.lang.annotation.*;/** * User: 苏若年 * Date: 14-10-9 * Time: 下午21:31 * Description: */@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface GeneratorField { /** * 是否为主键 * @return */ boolean primaryKey() default false; /** * 映射的字段名 * @return */ public String name() default "";}
3.用于废弃字段过滤的注解
package com.dobby.plugins.annotation;import java.lang.annotation.*;/** * User: pudongping * Date: 14-10-9 * Time: 下午21:15 * Description: */@Target({ElementType.METHOD,ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface AbolishedField { //标注映射时排除的字段}
注解定义完成后,我们需要在扫描到的实体中根据注解映射规则进行扫描时自动封装
自动封装的核心业务逻辑如下
/** * 根据对象构造,表映射 * @param object * 实体对象 * @return * 实体对象到字段表的映射,基于注解处理 */ public static EntityTable constructEntityTableWithObject(Object object){ EntityTable entityTable = null; try{ if(null == object){return null;} ConcurrentMap<String,String> entityToTable = new ConcurrentHashMap<String, String>(); boolean isGeneratorTable = object.getClass().isAnnotationPresent(GeneratorTable.class); System.out.println(object.getClass().getSimpleName()); if(isGeneratorTable){ GeneratorTable generatorTable = object.getClass().getAnnotation(GeneratorTable.class); if(StringUtils.isBlank(generatorTable.name())){ entityToTable.put(object.getClass().getSimpleName(),firstLower(object.getClass().getSimpleName())); }else{ entityToTable.put(object.getClass().getSimpleName(),generatorTable.name()); } }else{ entityToTable.put(object.getClass().getSimpleName(),firstLower(object.getClass().getSimpleName())); } Field[] fields = object.getClass().getDeclaredFields(); if(null != fields){ entityTable = new EntityTable(); //主键组 ConcurrentMap<String,String> propertyToKey = new ConcurrentHashMap<String,String>(); //字段组 ConcurrentMap<String,String> propertyToColumn = new ConcurrentHashMap<String, String>(); //主键到集合类型映射 ConcurrentMap<String,Object> propertyPKeyType = new ConcurrentHashMap<String,Object>(); for (int i = 0; i < fields.length; i++) { //判断是否剔除 boolean isAbolishedField = fields[i].isAnnotationPresent(AbolishedField.class); if(isAbolishedField){ //跳过该字段的提取 continue; } //判断是否是主键 boolean isGeneratorField = fields[i].isAnnotationPresent(GeneratorField.class); if(isGeneratorField){ // 取注解中的文字说明 GeneratorField generatorField = fields[i].getAnnotation(GeneratorField.class); boolean primaryKey = generatorField.primaryKey(); if(primaryKey){ //添加到主键集合 propertyPKeyType.put(fields[i].getName(),fields[i].getType().getName()); propertyToKey.put(fields[i].getName(),generatorField.name()); }else{ if(StringUtils.isBlank(generatorField.name())){ propertyToColumn.put(fields[i].getName(),fields[i].getName()); }else{ propertyToColumn.put(fields[i].getName(),generatorField.name()); } } continue; } propertyToColumn.put(fields[i].getName(), fields[i].getName()); } entityTable.setPropertyPKeyType(propertyPKeyType); entityTable.setPropertyToPKey(propertyToKey); entityTable.setPropertyToColumn(propertyToColumn); } entityTable.setEntityToTable(entityToTable); }catch (Exception e){ e.printStackTrace(); } return entityTable; }
EntityTable时实体与表结构映射的一个简易对象.
如下,我们定义的实体
package com.dobby.code.make.model;import com.dobby.plugins.annotation.AbolishedField;import com.dobby.plugins.annotation.GeneratorField;import com.dobby.plugins.annotation.GeneratorTable;import java.io.Serializable;/** * Created by 苏若念 on 2014/11/26. *///映射表别名@GeneratorTable(name = "tb_member")public class Member implements Serializable { //映射该字段,并且为主键,自定义字段别名 @GeneratorField(primaryKey = true, name = "m_Id") private Integer id; @GeneratorField(name = "member_name") private String memberName; //映射时不映射该字段 @AbolishedField private String address; //不使用注解,默认为使用属性名进行映射 private String zipCode; //getter and setter}
查看实体映射过程
EntityTable entityTable = BeanUtils.constructEntityTableWithPath("com.dobby.code.make.model.Member"); System.out.println("主键映射" + entityTable.getPropertyToPKey()); System.out.println("字段映射" + entityTable.getPropertyToColumn()); System.out.println("主键集合" + entityTable.getPropertyPKeyType()); System.out.println("表名映射" + entityTable.getEntityToTable());
通过注解映射后的结果如下:
主键映射{id=m_Id}字段映射{zipCode=zipCode, memberName=member_name}主键集合{id=java.lang.Integer}表名映射{Member=tb_member}
因为我们使用了注解映射过滤,所以address字段映射时被排斥.
转载请注明出处:[http://www.cnblogs.com/dennisit/p/4125103.html]
Java注解应用,自定义注解映射实现方案说明.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。