自己编写Go ORM

自己编写简易的GoORM


Go最近开始变得热门起来,我在工作的空闲时间尝试编写了一版简单版的Go语言的ORM,功能简单,老哥们可以做参考。

工具方法以以及主要结构体

结构体

1
2
3
4
5
6
7
8
type MySqler struct {
User string
PassWord string
Host string
Port string
DbName string
CharSet string
}

错误处理方法

1
2
3
4
5
func checkErr(i error) {
if i!=nil {
fmt.Println(i)
}
}

==方法小写私有方法==

反射参数结构体内容方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func dealStruct(bean interface{})([]string,[]interface{},string){
var fieldNames =make([]string,2)
var values =make([]interface{},2)
object := reflect.ValueOf(bean)
myref := object.Elem()
typeOfType := myref.Type()
structValues :=strings.Split(typeOfType.Name(),".")
var tableName string
if len(structValues)>1 {
tableName = structValues[len(structValues)-1]
}else{
tableName = structValues[0]
}
tableName = strings.ToLower(tableName)
for i:=0; i<myref.NumField(); i++{
field := myref.Field(i)
fieldNames[i] = typeOfType.Field(i).Name
values[i] = field.Interface()
}
return fieldNames,values,tableName
}

==方法小写私有方法==

组织字段参数方法

1
2
3
4
5
6
7
8
9
10
11
func composeFields(fieldNames []string)string{
var fields string
for i:=0;i<len(fieldNames);i++ {
if i!=len(fieldNames)-1 {
fields = fields+strings.ToLower(fieldNames[i])+","
}else{
fields = fields+strings.ToLower(fieldNames[i])
}
}
return fields
}

==方法小写私有方法==

组织变量参数方法

1
2
3
4
5
6
7
8
9
10
11
func composeValues(values []interface{})string{
var pars string
for i:=0;i<len(values);i++ {
if i!=len(values)-1 {
pars = pars+"?"+","
}else{
pars = pars+"?"
}
}
return pars
}

==方法小写私有方法==

INSERT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func (mySqler *MySqler)Insert(bean interface{})int64{
db:=mySqler.getConnection()
fieldNames,values,tableName :=dealStruct(bean)
fields := composeFields(fieldNames)
pars := composeValues(values)
sql :="INSERT into "+tableName+" ("+fields+") values ("+pars+")"
stmt, err := db.Prepare(sql)
checkErr(err)
res, err :=stmt.Exec(values[0],values[1])
checkErr(err)
id, err := res.LastInsertId()
checkErr(err)
return id
}

QUERY

1
2
3
4
5
6
7
8
9
func (mySqler *MySqler)Query(tableName string,condition string)*sql.Rows{
db:=mySqler.getConnection()
sql :="SELECT * from "+tableName+" where "+condition
fmt.Println(sql)
stmt, err := db.Prepare(sql)
checkErr(err)
resule ,err:=stmt.Query()
return resule
}

UPDATE

1
2
3
4
5
6
7
8
func (mySqler *MySqler)Update(tableName string,change string,condition string){
db:=mySqler.getConnection()
//UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
sql :="UPDATE "+tableName+" SET "+change+" where "+condition
stmt, err := db.Prepare(sql)
checkErr(err)
stmt.Exec()
}

DELETE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func (mySqler *MySqler)Delete(bean interface{}){
db:=mySqler.getConnection()
var condition string
fieldNames,values,tableName :=dealStruct(bean)
//DELETE FROM 表名称 WHERE 列名称 = 值
for i:=1;i<len(fieldNames) ;i++ {
if i!=len(fieldNames)-1 {
condition =condition+fieldNames[i]+" = ? AND"
}else{
condition =condition+fieldNames[i]+" = ?"
}
}
sql :="DELETE FROM "+tableName+" WHERE "+condition
fmt.Println(sql)
stmt, err := db.Prepare(sql)
checkErr(err)
stmt.Exec(values[1])
}

THE END ORM的使用方法例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
type User struct {
Id int
Name string
}
var mysqler dao.MySqler
func init(){
mysqler.CharSet="utf8"
mysqler.DbName="test_user"
mysqler.Host="localhost"
mysqler.Port= "3306"
mysqler.PassWord="root"
mysqler.User="root"
}
func main() {
//插入数据
userInsert :=&User{1,"大帅气"}
mysqler.Insert(userInsert)
//查询数据
result :=mysqler.Query("user",`name ="dashuaiqi"`)
//解析数据结果
var id int
var name string
for result.Next(){
result.Scan(&id,&name)
fmt.Println(id)
fmt.Println(name)
}
defer result.Close()
//更新数据
mysqler.Update("user",`name = "lwc"`,`name="dashuaiqi"`)
//删除数据
userDelete :=&User{1,"大帅气"}
mysqler.Delete(userDelete)
}

接下来会抽时间去完善这个ORM,包括注册表等等操作。详细代码可以参考GitHub:https://github.com/Callmedachang/MyUtils