造轮计划 ORM

前言

造轮计划

近期借助 SaaS 课程回顾了 Java 反射相关的知识,以及 Spring IOC 和 AOP 的基础知识。按照“能实现一定程度上代表能理解”的思想,尝试实现 ORM、IOC 和 AOP 三个常用轮子

再谈反射

反射是指在运行时动态地获取一个对象的信息以及操作对象的能力

这种操作的实现是通过对对象进行抽象(Classclass 的 class,class 的本质是通过描述实现多到一的抽象),再利用 Meta Object (Object 即 Data,Meta Object 即 MetaData)的描述信息复现对象,抽象使得流程细分成为可能,这种流程上的细分,使得运行时动态获取对象信息和操作对象成为可能

Java 中的反射机制
为静态语言赋予动态特性

Java 不是动态语言。动态语言是指在运行时可以动态地改变程序的结构和行为的语言,而Java是一种静态类型语言,它在编译时就需要确定变量的类型和方法的参数类型。Java的静态类型检查可以在编译时检查出类型错误,从而避免在运行时出现类型错误的情况。虽然Java提供了反射机制,可以在运行时动态地获取类的信息以及操作对象的能力,但是这并不意味着Java是动态语言。反射机制只是Java提供的一种灵活的编程方式,它可以在运行时动态地创建对象、调用方法、访问属性等,但是这并不改变Java是一种静态类型语言的本质。

反射的语法实现机制主要包括以下几个方面:

机制 描述
Class类 代表一个类的信息,包括类的名称、属性、方法等
Constructor类 代表一个类的构造器信息,可以用来创建对象
Method类 代表一个类的方法信息,可以用来调用对象的方法
Field类 代表一个类的属性信息,可以用来访问对象的属性
Modifier类 用于获取和修改访问修饰符的信息

通过这些类,程序可以在运行时获取类的信息,并且可以在运行时动态地创建对象、调用方法、访问属性等。反射机制虽然灵活,但是也会带来一定的性能损失,因此在使用时需要谨慎。

关键
个人总结

通过反射机制提供运行时获取对象信息和操作对象的能力

通过注解机制提供运行时可获取的辅助信息

反射机制的作用

反射机制可以用来实现以下功能:

  • 动态地创建对象:通过反射机制,可以在运行时动态地创建对象,而不需要在编译时就确定对象的类型。
  • 动态地调用方法:通过反射机制,可以在运行时动态地调用对象的方法,而不需要在编译时就确定方法的名称和参数类型。
  • 动态地访问属性:通过反射机制,可以在运行时动态地访问对象的属性,而不需要在编译时就确定属性的名称和类型。
  • 动态地获取类的信息:通过反射机制,可以在运行时动态地获取类的信息,包括类的属性、方法、构造器等。
注解机制的作用

注解机制是 Java 中一种元数据机制,它可以在代码中添加元数据信息,以便于编译器、工具和框架进行解析和处理。注解机制可以用来实现以下功能:

  • 标记代码:通过注解机制,可以在代码中添加标记,以便于编译器、工具和框架进行解析和处理。
  • 配置代码:通过注解机制,可以在代码中添加配置信息,以便于编译器、工具和框架进行解析和处理。
  • 生成代码:通过注解机制,可以在代码中添加生成代码的信息,以便于编译器、工具和框架进行生成代码。

ORM 实现

Object → Relation Table
基本映射关系
Object 对象 Relation Table 关系表
ClassName 类名 TableName 表名
Field 字段 Attribute 属性
操作方法 SQL 语句
约束——SQL 语句特有特征
  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY:暂不考虑
  • CHECK:暂不考虑
反射相关方法积累
方法示例 方法作用
Table table = obj.getClass().getAnnotation(Table.class) 获取注解对象
table.value() 获取注解对象中的value属性
Field[] fields = obj.getClass().getDeclaredFields() 无视访问权限限制,获取对象字段
field.setAccessible(true) 忽视访问权限限制,若不忽视,使用非 public 型字段会抛异常
field.getType() == String.class 获取字段类型,并判断是否为 String
field.get(obj) 获取字段值

层流分析

ORM 结构
  • 注解:提供辅助信息
    • Table
      • value:类名
    • Column
      • value:字段名称
      • type:字段数据类型
      • length:字段长度
      • primaryKey:主键
      • allowNull:是否为空
      • unique:是否唯一
  • 示例对象
    • User
      • id
      • name
  • JDBC:连接 MYSQL 数据库,逐句执行指令
    相当于 MYSQL 与 Java 程序之间的桥梁
  • SQL 语句生成器:生成 SQL 语句
    • Parser
      • createTable():生成建表语句
      • update():生成 UPDATE 语句
      • delete():生成 DELETE 语句
      • insert():生成 INSERT 语句
      • select():生成 SELECT 语句
ORM 流程
graph LR Example --调用--> Parser --生成SQL语句--> JDBC --提供SQL语句--> MYSQL

源码地址

https://github.com/Ba11ooner/orm-demo

posted @ 2023-05-19 17:38  Ba11ooner  阅读(13)  评论(0编辑  收藏  举报