Java学了很久了,始终没有深入学习过注解反射这些高级特性,晚上花时间研究了一下,其实还挺有意思的,貌似也搞清楚了像Hibernate这种框架的工作原理。
下面是我的项目截图:
很简单,就3个文件。
废话不多说,直接上代码。
//这个是,用来标记表的注解
package interfaces;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTable {
public String tableName();//表名
}
然后是,字段注解:
package interfaces;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Parament {
//用来生成SQL语句字段的时候用
public int length() default 11;
public String type();
public String colum();
public String isNull() default "NOT NULL";
}
最后是Model类
package model;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import interfaces.MyTable;
import interfaces.Parament;
@MyTable(tableName = "tb_student")
public class Student {
@Parament(length = 11, type = "INT", colum = "id")
int id;
@Parament(length = 11, type = "VARCHAR", colum = "name")
String name;
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 void generateModel() {
String tableName = "";
String sqlEtc = "";
StringBuilder SQL = new StringBuilder();
Class extends Student> clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
Annotation annotation = f.getAnnotation(Parament.class);
Parament parament = (Parament) annotation;
sqlEtc += "'" + f.getName() + "' " + parament.type() + "(" + parament.length() + ") " + parament.isNull()
+ ",\n";
}
Annotation[] annotations = this.getClass().getAnnotations();
for (int i = 0; i < annotations.length; i++) {
MyTable myTable = (MyTable) annotations[i];
tableName = myTable.tableName();
SQL.append("DROP TABLE IF EXISTS `" + tableName + "`;\n");
SQL.append("CREATE TABLE `" + tableName + "` (\n");
SQL.append(sqlEtc);
SQL.append(");\n");
System.err.println("最终的SQL效果:\n" + SQL.toString());
}
}
public static void main(String[] args) {
new Student().generateModel();
}
}
思路是:通过获取注解上面的值,来动态生成SQL语句,从而实现ORM映射。
最后看看效果:
我只是为了演示注解的用途,并不是为了讲解ORM是什么,希望此教程对大家有帮助。