【ORM】框架映射迷你版

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


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

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

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

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

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

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

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

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

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

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


扫描二维码关注公众号,回复: 1216308 查看本文章

首先定义两个注解:

/**
 * 表的别名
 * 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


猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/80444613