![在这里插入图片描述](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)
有疑问加站长微信联系(非本文作者))