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); } }