【七天从零实现ORM框架】Day05:条件组件API

memo012 · · 712 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

![在这里插入图片描述](https://img-blog.csdnimg.cn/202101261201364.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDY2MDY2,size_16,color_FFFFFF,t_70#pic_center) 今天是【7天从零实现TORM框架】的第四天,主要任务是: - 利用 statement 类包装条件组件API,代码40行左右。 若对Go中反射的使用不了解的话,我写了三篇关于反射的文章,给小伙伴提供参考,足以应对本项目中所使用的反射知识点。 - go反射第一弹:[https://mp.weixin.qq.com/s/F8yZyqC5UwoewsX0THqy1w](https://mp.weixin.qq.com/s/F8yZyqC5UwoewsX0THqy1w) - go反射第二弹:[https://mp.weixin.qq.com/s/lgZykTL8ls6aG0OMNSbZMw](https://mp.weixin.qq.com/s/lgZykTL8ls6aG0OMNSbZMw) - go反射第三弹:[https://mp.weixin.qq.com/s/vFt06c9herwTrx1LTxNaKg](https://mp.weixin.qq.com/s/vFt06c9herwTrx1LTxNaKg) > 源代码:在【迈莫coding】中回复关键字「 torm 」获取github地址链接. 后续会为【七天从零实现TORM框架】录制视频,文章+视频+代码 # 条件组件API 当用户条件查询时,torm会提供一套数据组件API,供用户选择,代码存储于根目录下的 statement 类中,代码结构如下所示: ```go // 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 只是起到过渡作用。 # 测试 ```go // 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]) } ``` **结果** ```go === 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 ``` # 代码目录 ```go 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资料。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126120345958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDY2MDY2,size_16,color_FFFFFF,t_70#pic_center)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

712 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传