Fork me on GitHub

关系对象映射

         ORM(object relationalMapping)                                                                         

 

      对象是一个内存结构,与关系数据型数据库中的记录从逻辑上说存在映射关系,但是从存储关系上说面向对象与关系型数据库存在互不匹配现象,对象关系映射是为了解决这种不匹配现象的技术,它通过描述对象和数据库之间映射关系的元素,将java程序中的对象自动持久化到关系数据库中,反过来讲数据库中的记录自动的读取到内存结构对象中。

      对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据库无法直接表达多对多关系和继承关系。ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

      在一个应用程序中不使用ORM时,可能会写不少数据访问层的代码,用来保存,更新到数据库,还需要删除等。有很多重复的代码,使用ORM将不会有这个问题,ORM将数据对象自动生成关系数据库识别的语句。ORM负责sql进行操作,业务逻辑只需要关心对象即可。

方法:

《1》自定义Annotation

             Annotation对程序的运行没有任何影响,它的目的主要在于对编译器或分析利用Java反射工具可以解析包,类,方法或者属性上的Annotation信息。

             定义一个Annotation和定义一个接口是非常相似的,定义接口使用的是interface关键字,定义一个Annotation使用的关键字是@interface

             public  @interface myAnnotation{}

          1  使用myAnnotation

                 @myAnnotation

                public void methodA(){}

            Annotation中参数类型是Java的基本类型、string Class、、enum、Annotation和这些类型的数组。

          2 带参数的Annotation

            public  @interface myAnnotation{

              String name();

}

         在myAnnotation中定义了一个名字为name的参数,类型为String。

              @myAnnotation(name="jerry")

                public void methodA(){

}

      给MyAnnotation的name参数赋值,如果不赋值,代码编译会报错。

 

       注:如果参数只有value,可以省略参数名称,及对应value属性赋值。

             @myAnnotation(value="jerry")

                public void methodA(){

}

等于

@myAnnotation("jerry")

                public void methodA(){

}

 

使用默认值

public  @interface myAnnotation{

              String value()default "jerry";

}

 

《2》meta-Annotation

       meta-Annotation就是Annotation类型的数据,也就是Annotation类型的Annotation。使用meta-Annotation主要是限制Annotation的使用对象,告诉编译器如何处理Annotation。

1、限制类型

public enum ELementType{

  TYPE,                    适用class interface,enum

FIELD,                     适用field

METHOD                  适用method

PARAMETER            适用method中的参数

CONSTRUCTOR,       适用构造方法

LOCAL_VARIABLE,   适用局部变量

ANNOTATION_TYPE,  适用Annotation类型

PACKAGE,  适用包

}

元注解在myAnnotation应用

@target(elementType.METHOD)

public  @interface myAnnotation{

              String[] value()";

}

2、告诉编译器如何处理Annotation

public enum RetentionPolicy{

SOURCE   编译器处理完Annotation信息后就没有任何作用了

CLASS      编译器将Annotation存储在class文件中,默认

RUNTIME   编译器将Annotation存储class文件中,可以由java虚拟机读取

}

 

@target(elementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public  @interface myAnnotation{

              String[] value()";

}

注解的反射

public class ReflectTest{

  public static void main(String[]args){

    Class<Test>c = Test.class;

    Method[]=methods = c.getDeclaredMethods();

     for(Method m:methods){

      MyAnnotation my =m.getAnnotation(MyAnnotation.class);

        if(null!=my){

        String[]str = my.value();

         System.out.println(Arrays.toString(str));

      }

    }

  }

}

 

posted @ 2014-08-05 21:23  淡无心  阅读(760)  评论(0编辑  收藏  举报