关系对象映射
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));
}
}
}
}