自定义注解使用实例

一、需求

  1.有一张用户表,字段包括用户ID,用户名,昵称,年龄,性别,所在城市,邮箱和手机号;

  2.方便的对每个字段的或字段的组合条件进行检索,并打印出sql语句。

二、代码

  1.用户表的实体类

 1 package com.anndemo.entity;
 2
 3 import com.anndemo.ann.Column;
 4 import com.anndemo.ann.Table;
 5
 6 /**
 7  * 用户表的实体类
 8  * @author chen
 9  *
10  */
11 @Table("user")
12 public class User {
13
14     @Column("id")
15     private int id;
16
17     @Column("user_name")
18     private String userName;
19
20     @Column("nick_name")
21     private String nickName;
22
23     @Column("age")
24     private int age;
25
26     @Column("city")
27     private String city;
28
29     @Column("email")
30     private String email;
31
32     @Column("mobile")
33     private String mobile;
34
35     public int getId() {
36         return id;
37     }
38     public void setId(int id) {
39         this.id = id;
40     }
41     public String getUserName() {
42         return userName;
43     }
44     public void setUserName(String userName) {
45         this.userName = userName;
46     }
47     public String getNickName() {
48         return nickName;
49     }
50     public void setNickName(String nickName) {
51         this.nickName = nickName;
52     }
53     public int getAge() {
54         return age;
55     }
56     public void setAge(int age) {
57         this.age = age;
58     }
59     public String getCity() {
60         return city;
61     }
62     public void setCity(String city) {
63         this.city = city;
64     }
65     public String getEmail() {
66         return email;
67     }
68     public void setEmail(String email) {
69         this.email = email;
70     }
71     public String getMobile() {
72         return mobile;
73     }
74     public void setMobile(String mobile) {
75         this.mobile = mobile;
76     }
77
78 }

User.java

  2.表注解类

 1 package com.anndemo.ann;
 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  * 对应数据表的注解
10  * @author chen
11  *
12  */
13 @Target({ElementType.TYPE})
14 @Retention(RetentionPolicy.RUNTIME)
15 public @interface Table {
16
17     String value();
18
19 }

Table.java

  3.字段注解类

 1 package com.anndemo.ann;
 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  * 对应数据表字段的注解
10  * @author chen
11  *
12  */
13 @Target({ElementType.FIELD})
14 @Retention(RetentionPolicy.RUNTIME)
15 public @interface Column {
16
17     String value();
18
19 }

Column.java

  4.查询实现类

 1 package com.anndemo.action;
 2
 3 import java.lang.reflect.Field;
 4 import java.lang.reflect.Method;
 5
 6 import com.anndemo.ann.Column;
 7 import com.anndemo.ann.Table;
 8 import com.anndemo.entity.User;
 9
10 /**
11  * 查询操作类
12  * @author chen
13  *
14  */
15 public class QueryAction {
16
17     public static void main(String[] args) {
18
19         User u1 = new User();
20         u1.setId(10);//查询id为10的用户
21
22         User u2 = new User();
23         u2.setUserName("Lucy");//模糊查询用户名为Lucy的用户
24
25         User u3 = new User();
26         u3.setEmail("[email protected], [email protected], [email protected]");//查询邮箱为其中任意一个的用户
27
28         String sql1 = query(u1);
29         String sql2 = query(u2);
30         String sql3 = query(u3);
31
32         System.out.println(sql1);
33         System.out.println(sql2);
34         System.out.println(sql3);
35
36     }
37
38     private static String query(User u) {
39
40         StringBuilder sb = new StringBuilder();//字符串变量(非线程安全)
41         //1.获取class
42         Class<?> c = u.getClass();
43         //2.获取到table的名字
44         boolean exists = c.isAnnotationPresent(Table.class);//检查User类中是否存在名称为Table的注解
45         if(!exists){
46             return null;
47         }
48         Table t = c.getAnnotation(Table.class);//获取Table注解
49         String tableName = t.value();//获取注解的属性值,即表名
50         sb.append("select * from ").append(tableName).append(" where 1 = 1");//拼装sql
51         //3.遍历所有字段
52         Field[] arrays = c.getDeclaredFields();//遍历User类中的所有属性
53         for(Field array: arrays){
54             //4.处理每个字段对应的sql
55             //4.1拿到字段名
56             boolean fExists = array.isAnnotationPresent(Column.class);//判断属性上是否存在名称为Column的注解
57             if(!fExists){
58                 continue;
59             }
60             Column column = array.getAnnotation(Column.class);//获取Column注解
61             String columnValue = column.value();//获取注解的属性值,即表中的字段名
62             //4.2拿到字段值
63             String fieldName = array.getName();//获取属性名
64             String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() +
65                     fieldName.substring(1);//获取该字段的getter方法名
66             Object fieldValue = null;
67             try {
68                 Method getMethod = c.getMethod(getMethodName);//获取该字段的getter方法
69                 fieldValue = (Object) getMethod.invoke(u);//通过反射获取getter方法的值
70             } catch (Exception e) {
71                 e.printStackTrace();
72             }
73             //4.3拼装sql
74             if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)){
75                 continue;
76             }
77             sb.append(" and ").append(columnValue);
78             if(fieldValue instanceof String){
79                 if(((String) fieldValue).contains(",")){
80                     String []values = ((String) fieldValue).split(",");
81                     sb.append(" in(");
82                     for(String value: values){
83                         sb.append("‘").append(value).append("‘,");
84                     }
85                     sb.deleteCharAt(sb.length() - 1);
86                     sb.append(")");
87                 }else{
88                     sb.append(" = ‘").append(fieldValue).append("‘");
89                 }
90             }else if(fieldValue instanceof Integer){
91                 sb.append(" = ").append(fieldValue);
92             }
93         }
94         return sb.toString();
95
96     }
97
98 }

QueryAction.java

自定义注解基础知识参考:自定义注解(http://www.cnblogs.com/jinjiyese/p/4817645.html)

参考:慕课网(http://www.imooc.com/learn/456)

时间: 2024-07-28 18:42:31

自定义注解使用实例的相关文章

注解:java 自定义注解应用实例

本例子旨在使用自定义注解为实体打上标记,为自动生成 sql 提供依据,模拟 hibernate 的注解,至于注解的原理自己搜吧 1.定义 Table 注解 [java] view plain copy package test; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lan

自定义注解实例分析

自定义注解Book /* 说明 : 如果一个注解中仅有一个属性数据, 那么请将该注解属性的名称定义为 value. 好处 : 使用该注解时, 可以省略该属性的名称. */ // @Target 使用的目标位置 @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) // Retention 保留 // 注意 : 反射必须将 `保留策略` 定义运行时, 没有选择. // @see java.lang.reflect.An

Java自定义注解

自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承Java.lang.Annotation这一接口,并且不能再去继承别的类或是接口. 2. 参数成员只能用public或默认(default)这两个访问权修饰 3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String.Enum.Class.annotations等数据类型,以及这一些类

【java开发系列】—— 自定义注解(转)

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

自定义注解框架的那些事

一.前言 距离上次更新已过一个半月,工作太忙也不是停更的理由.我这方面做得很不好,希望大家给予监督.首先会讲解[编译期资源注入],接着是[下拉刷新注入](通过注解来实现下拉刷新功能),最后打造一款[特色的注解框架]. 大家准备好公交卡了吗,开车了 - 二.什么是注解 每位童鞋对 注解 都有自己的理解,字面上的意思就是[额外的加入],在项目当中使用的注解的框架已经越来越多,如 : retrofit ,butterknife,androidannotations - 2017年Android百大框架

利用反射实现简单的Spring注解注入实例

一时兴起,这两天看了看Spring的源代码,就想写一个简单的Spring利用注解注入!!Spring的注解注入方式给了我们很方便的好处!大家应该都了解Spring的注入原理,在这里写下一个非常简单的使用注解来注入的实例,做个小小的笔记! 要使用注解,那就绝对和反射离不开.摘抄一段 Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显示出来. J

深入理解Java:注解(Annotation)自定义注解入门

引用: http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected

java自定义注解类

一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Tar

(转)深入理解Java:注解(Annotation)自定义注解入门

向作者致敬! 转自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email pro