hibernate注解的实现原理之1

来源:互联网 发布:linux xargs cat命令 编辑:程序博客网 时间:2024/06/16 13:38

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,执行相关的建表语句,相关功能代码待续!

原创粉丝点击