插件结构如图:

注册模块定义了三个:用于实体与表映射的注解,用于属性到表字段的映射,用于映射时过滤掉的注解.

1.用于实体与表映射的注解

  1. package com.dobby.plugins.annotation;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. /**
  9. * User: 苏若年
  10. * Date: 14-10-9
  11. * Time: 下午21:12
  12. * Description:
  13. */
  14.  
  15. @Target(ElementType.TYPE)
  16. @Retention(RetentionPolicy.RUNTIME)
  17. public @interface GeneratorTable {
  18.  
  19. //标注映射时的表名
  20. public String name() default "";
  21.  
  22. }

2.用于属性与字段映射的注解

  1. package com.dobby.plugins.annotation;
  2.  
  3. import java.lang.annotation.*;
  4.  
  5. /**
  6. * User: 苏若年
  7. * Date: 14-10-9
  8. * Time: 下午21:31
  9. * Description:
  10. */
  11. @Target({ElementType.METHOD,ElementType.FIELD})
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @Inherited
  14. @Documented
  15. public @interface GeneratorField {
  16.  
  17. /**
  18. * 是否为主键
  19. * @return
  20. */
  21. boolean primaryKey() default false;
  22.  
  23. /**
  24. * 映射的字段名
  25. * @return
  26. */
  27. public String name() default "";
  28. }

3.用于废弃字段过滤的注解

  1. package com.dobby.plugins.annotation;
  2.  
  3. import java.lang.annotation.*;
  4.  
  5. /**
  6. * User: 苏若年
  7. * Date: 14-10-9
  8. * Time: 下午21:15
  9. * Description:
  10. */
  11. @Target({ElementType.METHOD,ElementType.FIELD})
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @Inherited
  14. @Documented
  15. public @interface AbolishedField {
  16. //标注映射时排除的字段
  17. }

注解定义完成后,我们需要在扫描到的实体中根据注解映射规则进行扫描时自动封装

自动封装的核心业务逻辑如下

  1. /**
  2. * 根据对象构造,表映射
  3. * @param object
  4. * 实体对象
  5. * @return
  6. * 实体对象到字段表的映射,基于注解处理
  7. */
  8. public static EntityTable constructEntityTableWithObject(Object object){
  9. EntityTable entityTable = null;
  10. try{
  11. if(null == object){return null;}
  12.  
  13. ConcurrentMap<String,String> entityToTable = new ConcurrentHashMap<String, String>();
  14. boolean isGeneratorTable = object.getClass().isAnnotationPresent(GeneratorTable.class);
  15. System.out.println(object.getClass().getSimpleName());
  16. if(isGeneratorTable){
  17. GeneratorTable generatorTable = object.getClass().getAnnotation(GeneratorTable.class);
  18. if(StringUtils.isBlank(generatorTable.name())){
  19. entityToTable.put(object.getClass().getSimpleName(),firstLower(object.getClass().getSimpleName()));
  20. }else{
  21. entityToTable.put(object.getClass().getSimpleName(),generatorTable.name());
  22. }
  23. }else{
  24. entityToTable.put(object.getClass().getSimpleName(),firstLower(object.getClass().getSimpleName()));
  25. }
  26. Field[] fields = object.getClass().getDeclaredFields();
  27. if(null != fields){
  28. entityTable = new EntityTable();
  29. //主键组
  30. ConcurrentMap<String,String> propertyToKey = new ConcurrentHashMap<String,String>();
  31. //字段组
  32. ConcurrentMap<String,String> propertyToColumn = new ConcurrentHashMap<String, String>();
  33. //主键到集合类型映射
  34. ConcurrentMap<String,Object> propertyPKeyType = new ConcurrentHashMap<String,Object>();
  35.  
  36. for (int i = 0; i < fields.length; i++) {
  37. //判断是否剔除
  38. boolean isAbolishedField = fields[i].isAnnotationPresent(AbolishedField.class);
  39. if(isAbolishedField){
  40. //跳过该字段的提取
  41. continue;
  42. }
  43. //判断是否是主键
  44. boolean isGeneratorField = fields[i].isAnnotationPresent(GeneratorField.class);
  45. if(isGeneratorField){
  46. // 取注解中的文字说明
  47. GeneratorField generatorField = fields[i].getAnnotation(GeneratorField.class);
  48. boolean primaryKey = generatorField.primaryKey();
  49. if(primaryKey){
  50. //添加到主键集合
  51. propertyPKeyType.put(fields[i].getName(),fields[i].getType().getName());
  52. propertyToKey.put(fields[i].getName(),generatorField.name());
  53. }else{
  54. if(StringUtils.isBlank(generatorField.name())){
  55. propertyToColumn.put(fields[i].getName(),fields[i].getName());
  56. }else{
  57. propertyToColumn.put(fields[i].getName(),generatorField.name());
  58. }
  59. }
  60. continue;
  61. }
  62. propertyToColumn.put(fields[i].getName(), fields[i].getName());
  63. }
  64. entityTable.setPropertyPKeyType(propertyPKeyType);
  65. entityTable.setPropertyToPKey(propertyToKey);
  66. entityTable.setPropertyToColumn(propertyToColumn);
  67. }
  68. entityTable.setEntityToTable(entityToTable);
  69. }catch (Exception e){
  70. e.printStackTrace();
  71. }
  72. return entityTable;
  73. }
  1. EntityTable时实体与表结构映射的一个简易对象.

如下,我们定义的实体

  1. package com.dobby.code.make.model;
  2.  
  3. import com.dobby.plugins.annotation.AbolishedField;
  4. import com.dobby.plugins.annotation.GeneratorField;
  5. import com.dobby.plugins.annotation.GeneratorTable;
  6.  
  7. import java.io.Serializable;
  8.  
  9. /**
  10. * Created by 苏若年 on 2014/11/26.
  11. */
  12. //映射表别名
  13. @GeneratorTable(name = "tb_member")
  14. public class Member implements Serializable {
  15.  
  16. //映射该字段,并且为主键,自定义字段别名
  17. @GeneratorField(primaryKey = true, name = "m_Id")
  18. private Integer id;
  19.  
  20. @GeneratorField(name = "member_name")
  21. private String memberName;
  22.  
  23. //映射时不映射该字段
  24. @AbolishedField
  25. private String address;
  26.  
  27. //不使用注解,默认为使用属性名进行映射
  28. private String zipCode;
  29.  
  30. //getter and setter
  31.  
  32. }

查看实体映射过程

  1. EntityTable entityTable = BeanUtils.constructEntityTableWithPath("com.dobby.code.make.model.Member");
  2. System.out.println("主键映射" + entityTable.getPropertyToPKey());
  3. System.out.println("字段映射" + entityTable.getPropertyToColumn());
  4. System.out.println("主键集合" + entityTable.getPropertyPKeyType());
  5. System.out.println("表名映射" + entityTable.getEntityToTable());

通过注解映射后的结果如下:

  1. 主键映射{id=m_Id}
  2. 字段映射{zipCode=zipCode, memberName=member_name}
  3. 主键集合{id=java.lang.Integer}
  4. 表名映射{Member=tb_member}

因为使用了注解映射过滤,所以address字段映射时被排除.

转载请注明出处:[http://www.cnblogs.com/dennisit/p/4125103.html]

Java注解应用,自定义注解映射实现方案说明.的更多相关文章

  1. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

  2. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  3. Springboot--元注解及自定义注解(表单验证)

    本文简单说明一下元注解,然后对元注解中的@Retention做深入的讨论,在文章最后使用元注解写一个自定义注解来结尾. 一.结论: @Target:注解的作用目标 @Target(ElementTyp ...

  4. java注解和自定义注解的简单使用

    前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...

  5. Java反射与自定义注解

    反射,在Java常用框架中屡见不鲜.它存在于java.lang.reflact包中,就我的认识,它可以拿到类的字段和方法,及构造方法,还可以生成对象实例等.对深入的机制我暂时还不了解,本篇文章着重在使 ...

  6. java内置注解、元注解和自定义注解

    注解的作用: 1.生成文档 2.跟踪代码依赖性 3.编译时进行格式检查 ---------------------------------------------------------------- ...

  7. Java:深入自定义注解(Annotation)

    在网上找了很多资料也有写的比较好的,但是总有有一点半点的细节没有写出来,在这里自己总结下使用. 使用Java的自定义注解,首先个人需要了解下Java为我们提供的元注解和相关定义注解的语法.(这个我在网 ...

  8. Java注解(自定义注解、view注入)

    注解这东西虽然在jdk1.5就加进来了,但他的存在还是因为使用Afinal框架的view注入才知道的.一直觉得注入特神奇,加了一句就可以把对应view生成了. 下面我们来认识一下注解这个东西 一.注解 ...

  9. Java中的自定义注解

    ## 元注解 要声明一个注解, 我们需要元注解, 元注解是指注解的注解,包括@Retention, @Target, @Document, @Inherited. @Retention 注解的保留位置 ...

随机推荐

  1. 2.2博客系统 |FileField字段 |Media配置

    基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...

  2. 024 IDEA不能新建spring下的配置文件xml

    这个问题以前就遇到过,一直懒得解决,现在必须要用了,解决了一下,发现网上的解决方式果然不错. 1.现象 2.解决方式 需要添加一下spring context的依赖即可

  3. python日期与时间

    1.介绍 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表 ...

  4. 启用mysql的sql日志

    在mysql命令行或者客户端管理工具中执行:SHOW VARIABLES LIKE "general_log%"; 结果: general_log OFFgeneral_log_f ...

  5. Volley网络通信框架

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  6. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串

    1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...

  7. 幕布V1.1.9最新版漏洞集合

    0X00 前言 幕布本人最早接触是在P神的知识星球里面看到P神推荐的,后来下了个用着还挺好用. 之前一直都放一些零零散散的笔记,最近整理的时候,一时兴起,本着漏洞源于生活的态度,遂对幕布的安全性做了些 ...

  8. grpc ssl使用

    相关链接 http://www.jianshu.com/p/2873a8349ca0

  9. 项目冲刺 Seventh

    Seventh Sprint 1.各个成员今日完成的任务 蔡振翼:编写博客 谢孟轩:消息功能的实现,各页面与功能的调试优化 林凯:优化注册判断逻辑,整合相关代码 肖志豪:帮助组员 吴文清:完成管理员信 ...

  10. Codeforces.392E.Deleting Substrings(区间DP)

    题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...