自定義註解
之前看過別人寫的照着寫了一份,馬上就忘記了,現在整理一下以備後忘:
- 自定義註解
- 建表語句
命名一個表名註解
package com.wx.DataBaseUtil.CustomAnnotation;
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)// 註解會在class字節碼文件中存在,在運行時可以通過反射獲取到
public @interface Table {
public String tableName();
}
命名一個表示字段的註解
package 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 {
public String field() ; //字段名稱
public boolean primaryKey() default false;//是否爲主鍵
public String type() default "VARCHAR(80)";//字段類型
public boolean defaultNull() default true; //是否允許爲空
}
注意,這裏自定義註解生效的方法是在註解上添加@Target @Retention
各自的作用閾:
4@Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認的保留策略,註解會在class字節碼文件中存在,但運行時無法獲得
@Target:註解的作用目標
@Target(ElementType.TYPE) //接口、類、枚舉、註解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數
@Target(ElementType.CONSTRUCTOR) //構造函數
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//註解
@Target(ElementType.PACKAGE) ///包
@Document:說明該註解將被包含在javadoc中
@Inherited:說明子類可以繼承父類中的該註解`
數據表工具類:TableUtils
package com.wx.DataBaseUtil.commonUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import com.wx.DataBaseUtil.CustomAnnotation.Column;
import com.wx.DataBaseUtil.CustomAnnotation.Table;
public class TableSql {
public String getCreateTableSql(Class<?> clazz){
StringBuilder sb=new StringBuilder();
Table table=clazz.getAnnotation(Table.class);
String tableName=table.tableName();
sb.append("DROP TABLE IF EXISTS ").append(tableName).append(";\n");
sb.append("CREATE TABLE ").append(tableName).append("(").append("\n");
//由於字段不可能只有一個 所以 先得到所有的字段
Field[] field=clazz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
Column column=field[i].getAnnotation(Column.class);
String columnName=column.columnName();
String type=column.type();
boolean defaultNull=column.defaultNull();
boolean primaryKey=column.primaryKey();
sb.append(columnName).append("\t").append(type+"\t");
if(primaryKey){
sb.append("PRIMARY Key ");
}
if(defaultNull){
sb.append("DEFAULT NULL ,\n");
}else{
sb.append("NOT NULL ,\n");
}
}
sb.append("\n) DEFAULT CHARSET=utf8");
return sb.toString();
}
}
::::::getAnnotation(); 取得該類的信息
- Table table=clazz.getAnnotation(Table.class);
- Column column=field[i].getAnnotation(Column.class);
由於字段不可能只有一個 所以 先得到所有的字段
- 註解加載類上 使用@Target(ElementType.TYPE),使用時通過反射
註解類 註解類對象=clazz.getAnnotation(類.class); - 註解加載在字段上 , 使用
Field[] fields=clazz.getDeclaredFields();
註解類 註解類對象=field.getAnnotation(註解類 .class);