package user
import (
"bytes"
"fmt"
"reflect"
"strconv"
"strings"
"text/template"
)
const (
COLUMNS = `
id ID,
code Code
`
SEARCH_COUNT = `
SELECT
count(0) count
FROM user
WHERE 1=1
`
SEARCH = `
SELECT
{{COLUMNS}}
FROM user
LEFT JOIN user
`
INSERT = `
{{$size := (len .) |Sub 1}}
INSERT INTO sm_user(id,code,name)
VALUES
{{range $index, $elem := .}}
(E_SEQ('sm_user'),'{{.Code}}'){{ if ne $index $size }} ,{{else}};{{end}}
{{end}}
`
UPDATE = `
UPDATE sm_user set
{{if ne .Code ""}} code='{{.Code}}', {{end}}
{{if ne .Name ""}} name='{{.Name}}',{{end}}
update_time=NOW()
WHERE id={{.ID}}
`
DELETE = ` UPDATE sm_user set deleted_flag='Y' WHERE id={{.ID}} `
WHERE = `
{{if ne .Code ""}} and smu.code = '{{.Code}}' , {{end}}
{{if ne .Name ""}} and smu.name = '{{.Name}}' {{end}}
`
)
var (
count *template.Template
search *template.Template
insert *template.Template
update *template.Template
delete *template.Template
condition *template.Template
funcs map[string]interface{}
)
//给template添加自定义的方法
func init(){
funcs = template.FuncMap{"Add": Add,"Sub":Sub}
}
//根据业务组装相应的SQL
func assembly(model interface{}, mode string) string {
buffer := bytes.NewBufferString("")
switch mode {
case "searchCount":
if count == nil {
count = template.New("count")
count.Parse(SEARCH_COUNT)
}
count.Execute(buffer, model)
buffer.WriteString(where(model, mode))
break
case "get":
if count == nil {
count = template.New("search")
count.Parse(SEARCH_COUNT)
}
count.Execute(buffer, model)
buffer.WriteString(" limit 1")
break
case "search":
if search == nil {
search = template.New("search")
//此处可以修改为子模板 {{template "COLUMNS" .}}
search.Parse(strings.Replace(SEARCH, "{{COLUMNS}}", COLUMNS, -1))
}
search.Execute(buffer, model)
buffer.WriteString(where(model, mode))
break
case "searchPage":
if search == nil {
search = template.New("search")
search.Parse(strings.Replace(SEARCH, "{{COLUMNS}}", COLUMNS, -1))
}
search.Execute(buffer, model)
buffer.WriteString(where(model, mode))
buffer.WriteString(limit(model))
break
case "insert":
if insert == nil {
insert = template.New("insert")
insert.Parse(INSERT)
}
insert.Execute(buffer, model)
break
case "batchInsert":
if insert == nil {
insert = template.New("insert").Funcs(funcs)
insert.Parse(INSERT)
}
insert.Execute(buffer, model)
break
case "update":
if update == nil {
update = template.New("update")
update.Parse(UPDATE)
}
update.Execute(buffer, model)
break
case "delete":
if delete == nil {
delete = template.New("delete")
update.Parse(DELETE)
}
update.Execute(buffer, model)
break
}
fmt.Println(buffer.String())
return buffer.String()
}
//条件where
func where(model interface{}, mode string) string {
buffer := bytes.NewBufferString("")
if condition == nil {
condition = template.New("where")
condition.Parse(WHERE)
}
condition.Execute(buffer, model)
return buffer.String()
}
//分页limit
func limit(model interface{}) string {
invoke := reflect.ValueOf(model).Elem()
//fmt.Println("%t",invoke.Kind())
//fmt.Println("%t",invoke.FieldByName("PageNo"))
pageNo := invoke.FieldByName("PageNo").Int()
pageSize := invoke.FieldByName("PageSize").Int()
offset := (pageNo - 1) * pageSize
return " limit " + strconv.FormatInt(offset, 10) + "," + strconv.FormatInt(pageSize, 10)
}
func Add(left int, right int) int{
return left+right
}
func Sub(left int, right int) int{
return right - left
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS后台模式借助位置更新实现
- websocket借助Redis实现实时双工通信
- 借助 Webpack 静态分析能力实现代码动态加载
- [译] 借助 Pod 删除事件的传播实现 Pod 摘流
- 借助wbr标签实现连续英文字符的精准换行
- 借助 Turbolinks 实现不间断的网页音乐播放器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MySQL必知必会
[英] Ben Forta / 刘晓霞、钟鸣 / 人民邮电出版社 / 2009-1 / 39.00元
《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。一起来看看 《MySQL必知必会》 这本书的介绍吧!