注解本质上就是一个接口,该接口默认继承Annotation接口

  1. 元注解

     元注解的作用就是描述其他注解。Java1.5定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java1.5定义的元注解有以下几种:

    • @Target
    • @Retention
    • @Documented
    • @Inherited

      @Target

      用于描述注解的范围,即注解在哪用。它说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)等。取值类型(ElementType)有以下几种:

    1. CONSTRUCTOR:用于描述构造器
    2. FIELD:用于描述域即类成员变量
    3. LOCAL_VARIABLE:用于描述局部变量
    4. METHOD:用于描述方法
    5. PACKAGE:用于描述包
    6. PARAMETER:用于描述参数
    7. TYPE:用于描述类、接口(包括注解类型) 或enum声明
    8. TYPE_PARAMETER:1.8版本开始,描述类、接口或enum参数的声明
    9. TYPE_USE:1.8版本开始,描述一种类、接口或enum的使用声明

      @Retention

      用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。取值类型(RetentionPolicy)有以下几种:

    1. SOURCE:在源文件中有效(即源文件保留)
    2. CLASS:在class文件中有效(即class保留)
    3. RUNTIME:在运行时有效(即运行时保留)

      @Documented

      用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。它是一个标记注解,没有成员。

        @Inherited

      用于表示某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

  2. 通过注解实现生成对应的SQL语句

@Target({ElementType.FIELD})//表示作用域是字段
@Retention(RetentionPolicy.RUNTIME)//生命周期为运行时
public @interface Column {   String value();
}
@Table("user")
public class Filer {   @Column("id")
  private int id;   @Column("userName")
  private String userName;   @Column("nickName")
  private String nickName;   @Column("age")
  private int age;   @Column("city")
  private String city;   @Column("email")
  private String email;

  //省略getter,setter
}
/*
* 通过注释得到sql语句
*/
public class Test {
public static String query(Object f) {
StringBuilder sb = new StringBuilder();
// 获取到f的class对象
Class<?> c = f.getClass();
// 判断是否存在注释
boolean tableExists = c.isAnnotationPresent(Table.class);
if (!tableExists) {
return null;
}
// 获取Table 注释中的数据
Table table = (Table) c.getAnnotation(Table.class);
String tableValue = table.value();
sb.append("select * from " + tableValue + " where 1=1");// 初始化sql语句防止报错
// 遍历所有的字段
//由于字段的修饰符为private,使用getDeclaredFields()获取
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
boolean columnExists = field.isAnnotationPresent(Column.class);
if (!columnExists) {
continue;
}
// 获取Column 注释中的数据(字段)
Column column = field.getAnnotation(Column.class);
String columnValue = column.value();
// 获取的方法名字
String getMethodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
// 通过反射调用get方法(获取字段值)
Object fieldValue = null;
try {
Method getMethod = c.getMethod(getMethodName);
fieldValue = getMethod.invoke(f);
} catch (Exception e) {
e.printStackTrace();
}
// 拼装sql
if (fieldValue instanceof String && (String) fieldValue != null
|| fieldValue instanceof Integer && (Integer) fieldValue != 0) {
if (fieldValue instanceof String) {
if (((String) fieldValue).contains(",")) {
String[] values = ((String) fieldValue).split(",");
sb.append(" in(");
for (String value : values) {
sb.append("'").append(value).append("',");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
} else {
sb.append(" and ").append(columnValue + "='" + fieldValue + "'");
}
} else if (fieldValue instanceof Integer) {
sb.append(" and ").append(columnValue + "=" + fieldValue);
}
}
}
return sb.toString();
} public static void main(String[] args) {
Filer f1 = new Filer();
f1.setId(10);// 查询id为10的用户
f1.setAge(16); Filer f2 = new Filer();
f2.setUserName("lucy");// 查询用户为lucy的用户 Filer f3 = new Filer();
f3.setEmail("liu@qq.com,zh@163.com,7777@sina.com");// 查询email为其中任何一个 String sql1 = query(f1);
String sql2 = query(f2);
String sql3 = query(f3); System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
}
/*select * from user where 1=1 and id=10 and age=16*/
/*select * from user where 1=1 and userName='lucy'*/
/*select * from user where 1=1 in('liu@qq.com','zh@163.com','7777@sina.com')*/

Annotation注解初识的更多相关文章

  1. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  2. Hibernate的Annotation注解

    当项目变得比较大的时候,如何还使用hbm.xml文件来配置Hibernate实体就会变得比较复杂.这里Hibernate提供了Annotation注解方式,使得Hibernate的映射文件变得很方便管 ...

  3. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  4. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  5. hibernate annotation注解方式来处理映射关系

    在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式 ...

  6. Android开发学习之路--Annotation注解简化view控件之初体验

    一般我们在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,每次写这么多代码总 ...

  7. java EE中的hello1.java及Annotation(注解)

    一.Annotation(注解) 注解(Annotation)很重要,未来的开发模式都需要注解,注解是java.lang.annotation包,Annotation是从java5引入的,它提供一些不 ...

  8. Annotation(注解)介绍

    Annotation(注解)是什么: Annotation(注解) 官方的定义:    An annotation is a form of metadata, that can be added t ...

  9. Hibernate 零配置之Annotation注解

    JPA规范推荐使用Annotation来管理实体类与数据表之间的映射关系,从而避免同时维护两份文件(Java 实体类 和 XML 映射文件),将映射信息(写在Annotation中)与实体类集中在一起 ...

随机推荐

  1. PyTorch常用参数初始化方法详解

    1. 均匀分布 torch.nn.init.uniform_(tensor, a=0, b=1) 从均匀分布U(a, b)中采样,初始化张量. 参数: tensor - 需要填充的张量 a - 均匀分 ...

  2. C++学习笔记---引用的本质

    本质:引用本质上是C++内部实现的一个指针常量 发现是引用的话,自动帮我们转换成指针常量 运行后,发现修改ref的值那么a的值也会一起改变,这就说明了引用的本质就是指针

  3. js堆排序

    堆的预备知识 堆是一个完全二叉树. 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点). 大顶堆:根结点为最大值,每个 ...

  4. 简单又强大的pandas爬虫 利用pandas库的read_html()方法爬取网页表格型数据

    文章目录 一.简介 二.原理 三.爬取实战 实例1 实例2 一.简介 一般的爬虫套路无非是发送请求.获取响应.解析网页.提取数据.保存数据等步骤.构造请求主要用到requests库,定位提取数据用的比 ...

  5. Nginx的正向代理-反向代理-负载均衡

      正向代理与反向代理[总结]   1.前言 最近工作中用到反向代理,发现网络代理的玩法还真不少,网络背后有很多需要去学习.而在此之前仅仅使用了过代理软件,曾经为了访问google,使用了代理软件,需 ...

  6. Lambda表达式(三)

    public class Test04 { public static void main(String[] args) { /* * Java8中,有一个新的类:Stream类型,它代表一个数据加工 ...

  7. 深度学习中卷积层和pooling层的输出计算公式(转)

    原文链接:https://blog.csdn.net/yepeng_xinxian/article/details/82380707 1.卷积层的输出计算公式class torch.nn.Conv2d ...

  8. Linux部署常用命令

    1../startup.sh 开启tomcat服务 2.rm -f file1  删除文件 3.rmdir dir xxx 删除目录 4.Tab按钮 自动补全文件名称功能 5.gzip file1  ...

  9. 【转】Getting an Image on the Screen

    FROM:http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php Getting an Image o ...

  10. Redis 数据结构与编码技术 (Object Encoding)

    数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串.整数.位图) list:列表(可以表示线性表.栈.双端队列.阻塞队列) hash:哈希表 set:集 ...