什么是注解
我自己的理解,注解就是对对象内的元素(方法、成员变量、类名等)添加解释。
注解分为:
1.jdk注解:
2.第三方注解:
Spring常用注解:https://www.cnblogs.com/xingzc/p/5777814.html
常见第三方注解:https://www.cnblogs.com/jeremy5810/p/7760153.html
3.自定义注解
为什么使用注解
注解的主要使用场景在框架中,通过注解,可以极大地增强代码的简洁性和灵活性,省去了复杂的配置文件。
1.生成文档,通过代码里标识的元数据生成javadoc文档。
2.编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
3.编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
4.运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
如何使用注解
以手写自动建表框架为例:
自定义三个注解:
//前四行是元注解
//表示该注解表示的注解的作用域
@Target(ElementType.TYPE)
//表示该注解是运行期注解(分为编译时注解、编译时注解和运行时注解)
@Retention(RetentionPolicy.RUNTIME)
//支持继承
@inherited
//支持doc化
@documented
//注解的关键字是@interface
public @interface Table {
public String name();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {
public String name();
public int length();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name();
public int length();
public boolean isNull();
}
使用注解:
@Table(name="person")
public class Person {
public Person(){};
public Person(String name,int age){
this.setAge(age);
this.setName(name);
}
@PrimaryKey(name="id",length=10)
private int id;
@Column(name="name",length=20, isNull = false)
private String name;
@Column(name="age",length=20, isNull = false)
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
通过注解获取元素信息,自动生成建表语句:
public class SqlUtil {
public SqlUtil(){};
public SqlUtil(Class<?> obj){
this.obj=obj;
};
private Class<?> obj;
public String getTableName(){
String TableName="";
if(obj.isAnnotationPresent(Table.class)){
Table annotation=obj.getAnnotation(Table.class);
TableName=annotation.name();
}
return TableName;
}
public String createTable(){
String tableName=getTableName();
StringBuffer sb=new StringBuffer("");
sb.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append("(");
Field[] fields=obj.getDeclaredFields();
String str="";
for (Field field : fields) {
field.setAccessible(true);
if(field.isAnnotationPresent(Column.class)){
Column annotation=field.getAnnotation(Column.class);
if(String.class.isAssignableFrom(field.getType())){
String flag=annotation.isNull()==true?",":"NOT NULL,";
str+=annotation.name()+" VARCHAR("+annotation.length()+") "+flag;
}else{
String flag=annotation.isNull()==true?",":"NOT NULL,";
str+=annotation.name()+" INT("+annotation.length()+") "+flag;
}
}else{
PrimaryKey annotation=field.getAnnotation(PrimaryKey.class);
if(int.class.isAssignableFrom(field.getType())){
str+=annotation.name()+" INT("+annotation.length()+") PRIMARY KEY AUTO_INCREMENT,";
}
}
}
str=str.substring(0,str.length()-1)+")";
sb.append(str);
return sb.toString();
}
public Map<String,List<Object>> getInsertSql(Object o){
StringBuffer sb=new StringBuffer();
Map<String,List<Object>> map=new HashMap<String,List<Object>>();
List<Object> list=new ArrayList<Object>();
String tableName=getTableName();
sb.append("INSERT INTO ").append(tableName).append("(");
Field[] fields=obj.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.isAnnotationPresent(Column.class)){
Column annotation=field.getAnnotation(Column.class);
sb.append(annotation.name()).append(",");
try {
list.add(field.get(o));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
PrimaryKey annotation=field.getAnnotation(PrimaryKey.class);
sb.append(annotation.name()).append(",");
try {
list.add(field.get(o));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(") ").append("VALUES (");
for(int i=0;i<fields.length;i++){
sb.append("?,");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
map.put(sb.toString(), list);
return map;
}
public Map<String,List<Object>> getSelectSql(List<Object> require){
StringBuffer sb=new StringBuffer();
Map<String,List<Object>> map=new HashMap<String,List<Object>>();
String tableName=getTableName();
sb.append("SELECT * FROM ").append(tableName).append(" WHERE 1=1 ");
for(int i=0;i<require.size();i++){
sb.append("AND ").append(require.get(i)).append("=?,");
}
sb.deleteCharAt(sb.length()-1);
map.put(sb.toString(), require);
return map;
}
}
注意:
转自博客园每天1990:https://www.cnblogs.com/meitian/p/9048331.html