• 目录

Java的注解

阅读量: 383 编辑

一、Java的注解

  • Java 注解(Annotation),提供一种为程序类型设置数据的方法

  • Java 语言中的类、方法、变量、参数等都可以加注解

  • 注解是以@开始的,比如:@Override

二、来看几个Java注解的例子

public class HelloWorld {

   //Override重写父类方法的注解
   @Override
   public String toString() {
       return super.toString();
   }

   //表示此函数放弃维护,不建议调用者使用的注解
   @Deprecated
   public void myFunc(){

   }

   @SuppressWarnings("rawtypes")//忽略没有使用泛型的警告
   public static void main(String[] args) {
       List list = new ArrayList();
   }
}

三、Java自定义注解的语法

[@Retention(RetentionPolicy.RUNTIME)] //Retention和 Policy类型参考上方图片
[@Target(ElementType.FIELD)] //Target 和 ElementType参考上方图片
<modify> @interface <name> {
    [<type> <func-name>();] //函数
}

四、根据注解自动生成SQL的例子

一般我们会用Java的Bean(类)来对应数据库表和其中的字段。如果能让Bean通过注解表名、让属性注解表对应的列名,就可以很方便的把SQL通过Java的反射机制生成出来。

注解:MyTable.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTable {
    String name();//表名
}

注解:MyColumn.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyColumn {
    String name();//表中的列名(或字段名)
    int value() default 0;
}

所有Bean的父类:LongBean.java

public class LongBean {

    @MyColumn(name="id")
    public Long id;

}

数据库表对应的bean:Student.java

/**
 * User: 祁大聪
 */

@MyTable(name="t_student")
public class Student extends LongBean{

    @MyColumn(name="school")
    public String school;

    @MyColumn(name="address")
    public String address;

    @MyColumn(name="height")
    public int height;
}

测试类:JDBCTest.java

/**
 * User: 祁大聪
 * SQL
 * INSERT INTO t_user('name','user_name','password','id')
 * VALUES ('三妮','sanNi','root123','100')
 */
public class JDBCTest {

    public void insert(LongBean bean) throws Exception{
        //这是表的名称的注解
        MyTable mt = bean.getClass().getAnnotation(MyTable.class);
        String tableName = mt.name();

        //这是所有的属性
        Field[] fields = bean.getClass().getFields();
        String[] columns = new String[fields.length];
        String[] values = new String[fields.length];
        for(int i = 0 ; i < fields.length; i++){
            MyColumn mc = fields[i].getAnnotation(MyColumn.class);//属性的注解(字段)名
            columns[i] = "'" + mc.name() + "'";
            values[i] = "'" + fields[i].get(bean).toString() + "'";//属性的值
        }

        //生成SQL
        StringBuilder sb = new StringBuilder("INSERT INTO " + tableName);
        sb.append("("
                + String.join(",",columns)
                + ") VALUES ("
                + String.join(",",values)
                + ")"
        );

        System.out.println(sb);

        //调用SQL

    }

    public static void main(String[] args) {
        Student student = new Student();
        student.id = 100L;
        student.school = "xx大学";
        student.address = "北京";
        student.height = 170;

        //插入到数据库中
        JDBCTest jdbc = new JDBCTest();
        try { // ctrl + alt + t
            jdbc.insert(student);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五、Java注解类型结构图

  • 目录