zoukankan      html  css  js  c++  java
  • 第一周学习所获———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可以得到注解。

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

  • 相关阅读:
    Mysql 之导入导出
    Go gin之文件上传
    记录Go gin集成发送邮件接口的坑
    关于mysql某个用户无法登陆的情况
    面向对象程序设计的分析基本步骤
    提示框判断事件
    事件响应的公共方法
    IComparable<T>.CompareTo(T) 方法
    浏览器缓存机制
    PHP中include和require
  • 原文地址:https://www.cnblogs.com/zhuzihan/p/9035873.html
Copyright © 2011-2022 走看看