【七天从零实现ORM|Day05:条件组件API】学完迈入腾讯阿里大厂

在这里插入图片描述

今天是【7天从零实现TORM框架】的第四天,主要任务是:

  • 利用 statement 类包装条件组件API,代码40行左右。

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

源代码:在【迈莫coding】中回复关键字「 torm 」获取github地址链接.
后续会为【七天从零实现TORM框架】录制视频,文章+视频+代码

条件组件API

当用户条件查询时,torm会提供一套数据组件API,供用户选择,代码存储于根目录下的 statement 类中,代码结构如下所示:

// statement.go

package session
// 条件组装 用户API层
type Statement struct {
    
    
   clause *Clause
}
func NewStatement() *Statement {
    
    
   return &Statement{
    
    
      clause: newClause(),
   }
}
// SetTableName 设置表名
func (s *Statement) SetTableName(tableName string) *Statement {
    
    
   s.clause.tablename = tableName
   return s
}
// 新增数据API
func (s *Statement) InsertStruct(vars interface{
    
    }) *Statement {
    
    
   s.clause.insertStruct(vars)
   return s
}
// 修改数据API
func (s *Statement) UpdateStruct(vars interface{
    
    }) *Statement {
    
    
   s.clause.updateStruct(vars)
   return s
}
// where条件
func (s *Statement) AndEqual(field string, value interface{
    
    }) *Statement {
    
    
   s.clause.andEqual(field, value)
   return s
}
// where条件
func (s *Statement) OrEqual(field string, value interface{
    
    }) *Statement {
    
    
    s.clause.orEqual(field, value)
    return s
}
// Select
func (s *Statement) Select(field ...string) *Statement {
    
    
   s.clause.selectField(field...)
   return s
}

代码比较简单,就是调用 clause 类中对应方式, statement 只是起到过渡作用。

测试

// statement_test.go

package session
import (
   log "github.com/sirupsen/logrus"
   "testing"
)
func TestStatement_InsertStruct(t *testing.T) {
    
    
   user := &Users{
    
    
      Name: "迈莫coding",
      Age:  1,
   }
   statement := NewStatement()
   statement = statement.SetTableName("memo").
      InsertStruct(user)
   log.Info(statement.clause.sql)
   log.Info(statement.clause.params)
}
func TestStatement_UpdateStruct(t *testing.T) {
    
    
   user := &Users{
    
    
      Name: "迈莫coding",
   }
   statement := NewStatement()
   statement = statement.SetTableName("memo").
      UpdateStruct(user)
   log.Info(statement.clause.sqlType[Update])
   log.Info(statement.clause.paramsType[Update])
}

结果

=== RUN   TestStatement_InsertStruct
time="2021-01-16T11:47:37+08:00" level=info msg="INSERT INTO memo (Name,Age) VALUES (?,?)"
time="2021-01-16T11:47:37+08:00" level=info msg="[迈莫coding 1]"
--- PASS: TestStatement_InsertStruct (0.00s)
PASS

Process finished with exit code 0

代码目录

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
|--go.mod

今天的任务完成了,比较简单,内部调用 clause 类中的实现方法,意义在于开发人员修改底层实现逻辑时,不会影响用户条件组件API的调用,低耦合。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41066066/article/details/113177305