【七天从零实现ORM框架|Day01:序言】学完吊打面试官

【七天从零实现ORM框架|Day01:序言】学完吊打面试官TORM 框架介绍 TORM 为对象 关系映射 Object RelationalMa 简称 ORM 框架 是 七天系列 中的其中一篇关于 ORM 框架的项目 写这项目的目的主要有以下几点 用最少的代码来实现一款 ORM 框架通过 TORM 进而理解 ORM 实现原理去了解框架设计的奥妙代码实现过程关注 迈莫 coding 查看 TORM 实现过程文章 代码 文章 视频 后期会录 架构图函数调用图操作手册 Insert 操作手册 Delete 操作手册 Update 操作手册 Find 7 天 orm

TORM框架

TORM标题

七天教程规划

接下来我会将TORM框架的设计原理分为七天来讲述,每天完成其中一个模块,七天形成orm框架基础模型,下面所看到的就是我分为七天的实现功能,如下所示:。

  • Day01: 序言
  • Day02: database/sql基础
  • Day03: 对象表结构映射
  • Day04: 条件组件库
  • Day05: 条件组件API
  • Day06: 用户CRUD操作API
  • Day07: 支持事务

谈谈ORM框架

对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。

对象-数据库映射关系

数据库 高级编程语言
表(table) 类(class/struct)
记录 对象
字段(field/column) 对象属性

TORM由来

Go 语言中使用比较广泛 ORM 框架是 gorm 和 xorm。自己在实现过程,参考了他们的实现原理,同时也参考了【极客兔兔GeeORM】的实现方式,比如关键词SQL语句的封装和事务实现,就是借鉴【GeeORM】的实现方式。

但TORM框架与他们也有不同点,比如在gorm中单条查询语句的时候,表示结构如下所示:

// 获取第一个匹配记录 db.Where("name = ?", "jinzhu") 

在TORM中的单条查询API 为:

 statement = statement.SetTableName("user"). AndEqual("user_name", "迈莫coding"). Select("user_name,age") 

在TORM中提供了条件组件库,让用户来进行选择对应的条件进行组装,从而组装成完成的SQL语句,进而的到结果集。

TORM框架

TORM为对象-关系映射(Object-Relational Mapping,简称ORM)框架 ,是【七天系列】中的其中一篇关于ORM框架的项目,写这项目的目的主要有以下几点:

  • 用最少的代码来实现一款ORM框架
  • 通过TORM进而理解ORM实现原理
  • 去了解框架设计的奥妙

代码实现过程

若对Go中反射的使用不了解的话,我写了三篇关于反射的文章,给小伙伴提供参考,足以应对本项目中所使用的反射知识点。

  • go反射第一弹:https://mp.weixin..com/s/F8yZyqC5UwoewsX0THqy1w
  • go反射第二弹:https://mp.weixin..com/s/lgZykTL8ls6aG0OMNSbZMw
  • go反射第三弹:https://mp.weixin..com/s/vFt06c9herwTrx1LTxNaKg

代码目录

torm |--raw.go // 底层与数据库交互语句 |--raw_test.go |--schema.go // 对象表结构映射 |--schema_test.go |--generators.go // 关键词sql语句 |--clause.go // 条件组件库 |--clause_test.go |--statement.go // 条件组件库操作API  |--statement_test.go |--client.go // 用户CRUD操作API  |--client_test.go |--transaction.go // 支持事务 |--go.mod 

架构图

在这里插入图片描述

函数调用图

在这里插入图片描述

操作手册

  • Insert操作手册
  • Delete操作手册
  • Update操作手册
  • Find操作手册

Insert操作手册

向数据库中新增一条信息

package session import ( "context" "testing" log "github.com/sirupsen/logrus" ) func Newclient() (client *Client, err error) { 
    setting := Settings{ 
    DriverName: "mysql", User: "root", Password: "", Database: "po", Host: "127.0.0.1:3306", Options: map[string]string{ 
   "charset": "utf8mb4"}, } return NewClient(setting) } // 数据库新增使用示例 func TestSession_Insert(t *testing.T) { 
    user := &Users{ 
    Name: "迈莫coding", Age: 1, } statement := NewStatement() statement = statement.SetTableName("memo"). InsertStruct(user) client, _ := Newclient() client.Insert(context.Background(), statement) } 

FindOne操作手册

通过指定条件查询符合的一条数据

// 数据库单条查询示例 func TestSession_FindOne(t *testing.T) { 
    statement := NewStatement() statement = statement.SetTableName("user"). AndEqual("user_name", "迈莫"). Select("user_name,age") client, err := Newclient() if err != nil { 
    log.Error(err) return } user := &User{ 
   } _ = client.FindOne(context.Background(), statement, user) log.Info(user) } 

FindAll操作手册

// 数据库多条查询示例 func TestSession_FindAll(t *testing.T) { 
    statement := NewStatement() statement = statement.SetTableName("user"). Select("user_name,age") client, _ := Newclient() var user []User _ = client.FindAll(context.Background(), statement, &user) log.Info(user) } 

Delete操作手册

// 数据库删除数据示例 func TestSession_Delete(t *testing.T) { 
    statement := NewStatement() statement = statement.SetTableName("memo"). AndEqual("name", "迈莫coding") client, _ := Newclient() client.Delete(context.Background(), statement) } 

Update操作手册

// 数据库数据更新示例 func TestSession_Update(t *testing.T) { 
    user := &Users{ 
    Name: "迈莫", Age: 1, } statement := NewStatement() statement = statement.SetTableName("user"). UpdateStruct(user). AndEqual("user_name", "迈莫") client, _ := Newclient() client.Update(context.Background(), statement) } 

文章也会持续更新,可以微信搜索「 迈莫coding 」第一时间阅读,回复『1024』领取学习go资料。

在这里插入图片描述

今天的文章 【七天从零实现ORM框架|Day01:序言】学完吊打面试官分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-18 07:30
下一篇 2024-12-18 07:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/89980.html