110.借助golang 的template实现类mybatis

栏目: Java · 发布时间: 6年前

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
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创京东

创京东

李志刚 / 中信出版社 / 2015-5-1 / CNY 49.80

1998年,刘强东创业,在中关村经销光磁产品。2004年,因为非典,京东偶然之下转向线上销售。2014年,京东市值已超400亿美元,跻身全球前十大互联网公司之列。 这是一个听起来很传奇的创业故事,但只有当事人了解创业维艰。 刚转向电商时,传统企业前景光明,而电商看起来前途未卜,京东如何能毅然转型并坚持到底?资金匮乏的时候,京东靠什么说服投资人?在强大的对手面前,京东靠什么反超并一路领先......一起来看看 《创京东》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器