hibernate注解的实现原理之1 (一)

2014-11-24 10:14:30 · 作者: · 浏览: 0
hibernate 作为一种orm框架,是一种关系对象映射framework,它可以通过读取xml配置文件获取实体BEAN对应的属性,或者注解方式去读取实体bean的字段,最后根据字段,以及配置的表名,在相应 数据库生成表,或者持久化实体成表记录。
本节及之后的几个章节,都将讲解用注解方式如何简单模似hibernate根据实体对象如何生成数据表(操作数据的步骤,后面陆续讲解到)
hibernate注解的实现原理之step1 注解原理
1.简述:根据注解方式,注解某个实体BEAN,通过反射读取该BEAN类是否被注解了,该BEAN类的字段是否被注解了
2.注解原理
java jdk 在lang.annotation包下提供了一些注解工具,在此处特意提及到以下三个特殊的注解
@Target(value=ElementType.TYPE) 类型注解
@Retention(RetentionPolicy.RUNTIME) 注解信息保存或被读取的机制(CLASS,RUNTIME,SOURCE)
@Documented //文档化
3.例子:
下面以实体Student例子,说明如何自定义注解,通过对Student的注解,获取Student类的注解情况
demo code below:
###########################
#表名注解标签
package com.java.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TABLE {
String name() default "注解表名默认值";
}
#字段名注解标签
package com.java.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FIELD {
String name() default "";
String value() default "";
int[] intArr() default {1,2,3,4};
Class type() default String.class;
}
#Student类的注解情况
package com.java.annotation.classes;
import com.java.annotation.FIELD;
import com.java.annotation.TABLE;
@TABLE
public class Student {
private int id;
@FIELD(name="STU_NAME",value="xxx")
private String name;
@FIELD(name="STU_No",intArr={2,3,4})
private String studentNo;
public Student(int id, String name, String studentNo) {
super();
this.id = id;
this.name = name;
this.studentNo = studentNo;
}
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 String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
}
##测试类,获取Student的注解情况
package com.java.annotation.test;
import java.lang.reflect.Field;
import com.java.annotation.TABLE;
import com.java.annotation.FIELD;
import com.java.annotation.classes.Student;
public class AnnotationTest {
/**
* @param args
* zhao.z.w.
*/
public static void main(String[] args) {
Student student = new Student(12,"小蚊子", "STU123456");
Class cls = Student.class;
//判断Student类是否有加TABLE注解
if(cls.isAnnotationPresent(TABLE.class)){
System.out.println("Student类有注解@TABLE");
TABLE table = cls.getAnnotation(TABLE.class);
System.out.println("name='"+table