Java注解的简单应用

一.注解的定义

package com.microli.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

@interface 注解名{}

定义时需要添加内置的注解声明

  @Target:注解能使用在什么地方,值是ElementType数组

package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

  @Retention:注解信息存储的位置,通常使用RetentionPolicy.RUNTIME,可以在运行时获取其信息

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

二.注解简单应用之拼接查询语句

在框架中一般是使用注解配合反射拼接查询语句,例如:

1.定义两个注解,一个代表insert语句中的表名Table,一个代表列名Column(此时值都是String类型)

package com.microli.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//代表类注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}
package com.microli.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//代表属性注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

 

2.在JavaPOJO中,添加注解

package com.microli.annotation;

//类注解
@Table("user")
public class User {
    //属性注解
    @Column("account")
    private String  account;
    @Column("password")
    private String  password;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.编写DAO操作类,添加各种方法传入JavaPOJO得到对应的Sql语句,此处示例为add方法拼接insert语句做数据库的增加操作

package com.microli.annotation;

import java.lang.reflect.Field;

public class DAO {
    /**
     * 拼接插入Sql语句
     *
     * @param t   形参(例:user)
     * @param <T> 形参类型(例:User)
     */
    public <T> void add(T t) throws Exception {
        //定义初始sql语句为空字符串以便后面拼接
        String sql = "";
        //得到参数 t 的Class类对象 c
        Class c = t.getClass();
        //得到类注解,即查询的表名
        Table table = (Table) c.getAnnotation(Table.class);
        //如果存在表名注解则取其值value拼接上sql字符串注意括号"("的存在
        if (table != null) {
            sql += "insert into " + table.value() + "(";//sql="insert into table(
        }
        //获取参数实体类中的所有属性
        Field[] fields = c.getDeclaredFields();
        //循环判断属性前是否有列名注解,有则取其值value拼接sql字符串注意逗号","的存在
        for (Field field : fields) {
            Column column = field.getAnnotation(Column.class);
            if (column != null) {
                sql += column.value() + ",";//sql="insert into table(column1,column2,
            }
        }
        //列名拼接完最后的逗号去除
        sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2
        //增加拼接sql赋值的字符串
        sql += ") values(";//sql="insert into table(column1,column2) values(

        //循环取出存在注解的属性值
        for (Field field : fields) {
            Column column = field.getAnnotation(Column.class);
            if (column != null) {
                //由于属性是私有,设置可访问
                field.setAccessible(true);
                //拼接属性值注意要有对应的单引号
                sql += "'" + field.get(t) + "',";//sql="insert into table(column1,column2) values('value1','value2',
            }
        }
        //值拼接完后最后逗号去除
        sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2) values('value1','value2'
        //拼接最后的括号")"
        sql += ")";//sql="insert into table(column1,column2) values('value1','value2')
        //得到完整的sql语句
        System.out.println(sql);

    }
}

4.测试

package com.microli.annotation;


public class Test {
    public static void main(String[] args) throws Exception {
        DAO dao = new DAO();
        User user = new User();
        user.setAccount("123");
        user.setPassword("qwe");
        dao.add(user);
    }
}

 

posted @ 2020-06-28 22:25  木子李和三点水  阅读(254)  评论(0编辑  收藏  举报