首页 > 其他分享 >造轮计划 ORM

造轮计划 ORM

时间:2023-05-19 17:46:11浏览次数:42  
标签:语句 反射 Java 对象 造轮 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

标签:语句,反射,Java,对象,造轮,ORM,计划,机制,动态
From: https://www.cnblogs.com/ba11ooner/p/17415875.html

相关文章

  • 造轮计划 AOP
    预备知识AOP实现AOP的理念和实现AOP(面向切面编程)是一种编程范式,它的理念是将程序的业务逻辑和系统级服务分离开来,从而提高代码的可重用性和可维护性。AOP的实现方式是通过在程序执行过程中动态地将额外的代码(称为“切面”)织入到原有代码中,从而实现对原有代码的增强。动态机......
  • 造轮计划 IOC
    IOC实现IOC的理念和实现理解IOC控制反转(InversionofControl,IoC)是一种设计模式,它将对象的创建和对象之间的依赖关系的管理从应用程序代码中转移到外部容器或框架中。这种模式的目的是减少应用程序代码的耦合度,使代码更加灵活和可维护。实现IOC实现IOC的方式有很多种,其中......
  • 从AWR快照中固定执行计划
    Troubleshooting/resolutionf18mgmxm76kdr–sql_idprovidebyuserchecksqlplanhistorycolbtimefora25selecta.sql_id,a.plan_hash_value,to_char(begin_interval_time,'dd-mon-yyhh24:mi')btime,executions_deltaexecutions,round(ELAPSED......
  • Transformer 估算 101
    本文主要介绍用于估算transformer类模型计算量需求和内存需求的相关数学方法。引言其实,很多有关transformer语言模型的一些基本且重要的信息都可以用很简单的方法估算出来。不幸的是,这些公式在NLP社区中鲜为人知。本文的目的是总结这些公式,阐明它们是如何推导出来的及其作......
  • el-table中的formatter 对列的值进行处理
    -后台返回的table数据不符合前端展示,下面是人员统计表:这样显然是不符合要求的。下面通过elementUI中的table提供了formatter这个属性来对传入的数据进行用户自定义的格式化。目的达到了,直接上代码:<!--*@Descripttion:el-table中的formatter对列的值进行处理*@version:......
  • 运行earthformer环境
    运行earthformer环境python-mpipinstalltorch==1.12.1+cu116torchvision==0.13.1+cu116-fhttps://download.pytorch.org/whl/torch_stable.htmlpython-mpipinstallpytorch_lightning==1.6.4python-mpipinstallxarraynetcdf4opencv-python我的numpy的版本是1.......
  • 庆军之xamarin.forms 第一次简单总结
    在我写了单元测试,并且手搓通过了单元测试之后。打包给了客户。客户反馈的问题是,数据只有一条。找了很久的原因。最后发现,因为没有为弹窗写单元测试。本来的回传数据,我写的,获取到数据之后。this.Model.Insert(0,数据),回传this.Model[this.Model.Count-1],最后只有一条数据了。总......
  • 通用格式化脚本format
    模仿zsh插件extact,因为代码格式化和解压相似,很多种类,需要识别源文件的后缀,进而调用合适的工具。这里只贴上部分,其他的部分几乎没有改动。 其他的有需要再加吧。......
  • ORM取数据很简单!是吗?
    简介几乎任何系统都以某种方式与外部数据存储一起运行。大多数情况下,外部数据存储是一个关系数据库,并且在实现时通常将数据提取任务委托给某些ORM。尽管ORM包含很多routine代码,但是另一方面也提供了一些新的抽象。MartinFowler写过一篇关于ORM的有趣文章,其中一个主要思想......
  • IDEA/WEBSTORM配置静态的html,提供给同一局域网访问
    配置端口和勾选不信任的链接 配置Deployment 最重要的一步:重启IDE访问配置的链接即可,可以把localhost改成本机的ip,供同一局域网的人使用了。 ......