欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【ORM】框架映射迷你版

程序员文章站 2022-05-13 21:59:52
...

什么是ORM呐,以下是网上找到的两个解释、感觉挺好、推荐给大家:


ORM(Object Relation Mapping):利用描述对象和数据库之间映射的元数据,自动且透明地把Java应用程序中的对象持久化到关系数据库中的表。

ORM(Object/Relation Mapping)解决的主要问题是对象-关系的映射。域模型和关系模型分别建立在概念模型的基础上。域模型是面向对象的,而关系模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。

————————————————————————————————————————————————————

ORM的主要目的是通过类和对象操作数据库,所以在ORM中必须解决编程语言中的类与对象和数据库中的表之间的映射。

(1)类与数据库中表的映射:数据库中的每一张表对应编程语言中的一个类,当用户对类进行基本操作(如创建实现,修改对象的属性,删除一个实例)时,ORM框架会自动对数据库中的表进行相应的CURD操作。

(2)对象与表中记录的映射:关系数据库中的一张表可能有多条记录,每条记录对应类的一个实例,当用户对一个对象进行修改时,ORM框架会自动对数据表中的相应记录进行修改。

(3)类的属性与数据库中表的字段的映射:数据库中表的字段的数据类型与类中的属性的类型也是一一对应的。

————————————————————————————————————————————————————

ORM是一个好东西,没有反射怎么行!是吧?怎么说到反射了呐,原因有很多,主要是因为今篇的主题用到它了,放心具体的反射原理我是不说写的【ORM】框架映射迷你版毕竟是底层的东西、水太深、带不好路

    反射的应用场景挺多的,比如jdbc、spring IOC、常用框架、一些注解的实现,这次的ORM框架映射的迷你版呐就用到了这些注解,话不多说了、进入主题,进入主题的最好方式就是举个例子:


首先定义两个注解:

/**
 * 表的别名
 * Created by phoebeM on 2018/05/24.
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface SetTable {
    String value();
}
/**
 * 属性注解
 * Created by phoebeM on 2018/05/24.
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface SetProperty {
    String name();
    int leng();
}

定义使用注解的实体类:

@SetTable("user_table")
public class UserEntity {
    @SetProperty(name = "user_name",leng = 10)
    private String userName;
    @SetProperty(name = "user_age",leng = 10)
    private Integer userAge;
    //省略get、set
}


具体的ORM是怎么起作用的呐?简单说明一下

说之前介绍一下知识点:

getAnnotations获取注解

SetProperty setProperty = declareFields[i].getAnnotation(SetProperty.class);
获取SetProperty类的注解

SetTable setTable = forName.getAnnotation(SetTable.class);
获取SetTable类的注解
formName.getAnnotations()这个是获取类上的注解,属性的注解获取不到

获取类的字段有两种方式:getFields()和getDeclaredFields(),这两者的区别吧:

    getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。 
    getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。


public static void main(String[] args) throws ClassNotFoundException {
       
            //方法的作用,就是初始化给定的类
        Class<?> forName = Class.forName("com.example.demo.domain.UserEntity");
        //拼接sql语句stringBuffer
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(" select ");
        Field[] declareFields = forName.getDeclaredFields();
        for (int i = 0; i < declareFields.length; i++) {
            SetProperty setProperty = declareFields[i].getAnnotation(SetProperty.class);
            String property = setProperty.name();
            stringBuffer.append(property);
            if (i == (declareFields.length -1)){
                stringBuffer.append(" form ");
            }else {
                stringBuffer.append(" , ");
            }
        }
        //获取某个注解对象
        SetTable setTable = forName.getAnnotation(SetTable.class);
        //表的名称
        String tabelName = setTable.value();
        stringBuffer.append(" " + tabelName);
        //select user_name,user_age from user_table
        System.out.println(stringBuffer.toString());

    }

总结:

    通过获取注解,得到值进而拼接sql,小例子大智慧哈


感谢分享:

http://www.jb51.net/article/117468.htm

https://www.cnblogs.com/JackZed/p/6888668.html

https://blog.csdn.net/u013539003/article/details/48293429

https://blog.csdn.net/qq_24145735/article/details/52181052