第一周学习所获———ORM,数据持久化,通过注解来实现数据持久化框架

1,什么是ORM?

object-relation-mapper 对象,关系,映射。在java中一切都是对象,而关系数据库中却是关系的存在,所以需要进行对象和关系的映射从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。说白了就是把关系型数据库封装成业务实体对象,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

orm实现的4个部分:

一个对持久类对象进行CRUD操作的API;

一个语言或API用来规定与类和类属性相关的查询;

一个规定Mapping METADATA的工具;

一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作。

2.什么是数据持久化?

狭义的理解,持久化仅仅是指把对象数据永久保存在数据库中,数据在计算机中一般由两个存储地,内存为暂存,数据库可以理解为永存;广义的理解,持久化包括和数据库相关的各种操作,封装了数据访问细节,为大部分业务逻辑提供面向对象的API。

     数据持久化的好处?

1、松散耦合,程序代码重用性强,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。

2、业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性。

3、持久化技术可以自动优化,以减少对数据库的访问量,提高程序运行效率。

3.通过annotation(注解)来实现数据的持久化

首先建立一个对应数据库中“关系”的对象

 1 package annotation;
 2 
 3 @Table("db_student")//配置对应的数据库表    类---数据库中的表
 4 public class Student {
 5 
 6     @Fieldzzh(columnName="studentName",type="varchar",length=10)//配置对应数据库中列的数据库细节   属性--数据库列
 7     private String studentName;
 8     @Fieldzzh(columnName="sex",type="varchar",length=2)//配置对应数据库中列的数据库细节    属性--数据库列
 9     private String sex;
10 }

建立两个注解文件,一个对应整个Student类的注解,一个对应类中 每个属性的注解

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = { ElementType.TYPE })//用于的对象target
@Retention(RetentionPolicy.RUNTIME)//运行的生命周期
public @interface Table {
    String value();
}
package annotation;

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)
public @interface Fieldzzh {
     String columnName();
     String type();
     int length();
     //还可以写主键,非空等等,把对象中的属性完全对应于数据库
}

在这里便基本完成了整个数据库的简单持久化过程,下面写一个持久化类,里面写上一切增加,修改....相关数据库操作

package annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class TestZhuzihan {
    
    public static void main(String[] args) throws NoSuchFieldException, SecurityException {
        try {
            Class stuClass = Class.forName("annotation.Student");
            //获得类的所有注解
            Annotation[] annotations = stuClass.getAnnotations();
            
            for(Annotation annotation : annotations){
                System.out.println(annotation);
            }
            
            //获得需要属性注解
            Field field = stuClass.getDeclaredField("studentName");
            Fieldzzh fieldzzh=field.getAnnotation(Fieldzzh.class);
            System.out.println("得到数据库对应实体"+fieldzzh.columnName()+"--"+fieldzzh.type()+"--"+fieldzzh.length());
            
        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
            
    }
}
@annotation.Table(value=db_student)
得到数据库对应实体studentName--varchar--10

 上面是运行结果

属性对应数据库中的列,但是列的细节就需要注解来配置了

这大概就是每次映射都必须要用到Class的原因吗,因为Class可以得到注解。

大部分是自己通过自己的理解组织的,忘指正。

猜你喜欢

转载自www.cnblogs.com/zhuzihan/p/9035873.html