一.注解的定义
packagecom.microli.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)public @interfaceColumn {
String value();
}
@interface 注解名{}
定义时需要添加内置的注解声明
@Target:注解能使用在什么地方,值是ElementType数组
packagejava.lang.annotation;public enumElementType {
TYPE,/*类、接口(包括注释类型)或枚举声明*/FIELD,/*字段声明(包括枚举常量)*/METHOD,/*方法声明*/PARAMETER,/*参数声明*/CONSTRUCTOR,/*构造方法声明*/LOCAL_VARIABLE,/*局部变量声明*/ANNOTATION_TYPE,/*注释类型声明*/PACKAGE/*包声明*/}
@Retention:注解信息存储的位置,通常使用RetentionPolicy.RUNTIME,可以在运行时获取其信息
packagejava.lang.annotation;public enumRetentionPolicy {
SOURCE,/*Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了*/CLASS,/*编译器将Annotation存储于类对应的.class文件中。默认行为*/RUNTIME/*编译器将Annotation存储于class文件中,并且可由JVM读入*/}
二.注解简单应用之拼接查询语句
在框架中一般是使用注解配合反射拼接查询语句,例如:
1.定义两个注解,一个代表insert语句中的表名Table,一个代表列名Column(此时值都是String类型)
packagecom.microli.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//代表类注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)public @interfaceTable {
String value();
}
packagecom.microli.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//代表属性注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)public @interfaceColumn {
String value();
}
2.在JavaPOJO中,添加注解
packagecom.microli.annotation;//类注解
@Table("user")public classUser {//属性注解
@Column("account")privateString account;
@Column("password")privateString password;publicString getAccount() {returnaccount;
}public voidsetAccount(String account) {this.account =account;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}
}
3.编写DAO操作类,添加各种方法传入JavaPOJO得到对应的Sql语句,此处示例为add方法拼接insert语句做数据库的增加操作
packagecom.microli.annotation;importjava.lang.reflect.Field;public classDAO {/*** 拼接插入Sql语句
*
*@paramt 形参(例:user)
*@param 形参类型(例:User)*/
public void add(T t) throwsException {//定义初始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.测试
packagecom.microli.annotation;public classTest {public static void main(String[] args) throwsException {
DAO dao= newDAO();
User user= newUser();
user.setAccount("123");
user.setPassword("qwe");
dao.add(user);
}
}