hibernate注解的实现原理之

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<Student> 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.name()+”‘”);
}else{
System.out.println(“Student类没有注解@TABLE”);
}
//反射获取所有Student类所有字段
Field[] fields = cls.getDeclaredFields();

for(Field field:fields){
if(field.isAnnotationPresent(FIELD.class)){
System.out.println(“字段名为”+field.getName()+”被@注解了:”);
FIELD f = field.getAnnotation(FIELD.class);
System.out.println(“name='”+f.name()+”‘”);
System.out.println(“value='”+f.value()+”‘”);
System.out.println(“type='”+f.type()+”‘”);
System.out.println(“intArr='”+f.intArr()+”‘”);
}else{
System.out.println(“字段名为”+field.getName()+”没有被@注解”);
}
}
}

}

 

##输出结果如下:

Student类有注解@TABLE
name=’注解表名默认值’
字段名为id没有被@注解
字段名为name被@注解了:
name=’STU_NAME’
value=’xxx’
type=’class java.lang.String’
intArr='[I@12b3374′
字段名为studentNo被@注解了:
name=’STU_No’
value=”
type=’class java.lang.String’
intArr='[I@13f3789′

接下来就是hibernate会从获取到的有注解的字段,去拼接SQL,执行相关的建表语句,相关功能代码待续!

标签