注解本质上就是一个接口,该接口默认继承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. wifi - 无线相关命令

    1.Linux环境下的无线相关操作命令 interface 指代当前网卡 一般是 wifi0 ,  eth0 ,  ath1等 ifconfig - 常用查看网络设定及控制网卡(Windows下是ip ...

  2. poj1837 01背包(雾

    Description A train has a locomotive that pulls the train with its many passenger coaches. If the lo ...

  3. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  4. Redis---05主从复制(一般模式)

    一.什么是主从复制 主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.用处 读写分离,性能扩展:容灾快速恢复 三.主从配置 1 ...

  5. java数据结构-05双向链表

    一.双向链式存储: ①简述:要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,Java中LinkedList集合类的实现就是双向链表 (以下图片为网络收集,侵删) ②特点:数据是非连续的,链 ...

  6. 常用命令--windows

    查看端口号是否占用并杀进程 1 netstat -ano | findstr " " 2 tasklist | findstr " " 3 taskkill / ...

  7. 使用AI技术获取图片文字与识别图像内容

    获取图片文字 如何使用python获取图片文字呢? 关注公众号[轻松学编程]了解更多- 1.通过python的第三方库pytesseract获取 通过pip install pytesseract导入 ...

  8. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  9. Java基础知识(三)

    一.hashCode 与 equals (重要) 面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?" 1 ...

  10. 使用 C# 9.0 新语法提升 if 语句美感

    C# 语言一贯秉承简洁优美的宗旨,每次升级都会带来一些语法糖,让我们可以使代码变得更简洁.本文分享两个使用 C# 9.0 提升 if 语句美感的技巧示例. 使用属性模式代替 IsNullOrEmpty ...