如何通過(guò)go自定義一個(gè)分頁(yè)插件
建議看這個(gè)之前,先看看這個(gè):go操作MySQL · Go語(yǔ)言中文文檔 (topgoer.com)
嗯...也不能叫做分頁(yè)插件,就是一個(gè)分頁(yè)工具類。
下載依賴
go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx
sql_util
我們自定義一個(gè)sql_util,用來(lái)封裝數(shù)據(jù)庫(kù)連接操作。ExecuteCUD()執(zhí)行增刪改操作。ExecuteSelectAll()執(zhí)行查詢操作。目前沒(méi)有查詢單個(gè)的,而且查詢到全部數(shù)據(jù),判斷查詢數(shù)據(jù)長(zhǎng)度即可。jointSqlStr() : 負(fù)責(zé)拼接sql字符串模版和動(dòng)態(tài)綁定的參數(shù)
package sql import ( "back-me/main/util" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "strings" ) const ( username = "root" password = "123456" host = "localhost" port = 3306 dbname = "fdis" ) var Db *sqlx.DB func init() { connectToDatabase() } // 連接數(shù)據(jù)庫(kù) func connectToDatabase() { dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=true&loc=Local", username, password, host, port, dbname) db, err := sqlx.Open("mysql", dataSourceName) if err != nil { util.Log.Error("sql connection error:" + err.Error()) } // 檢查是否連接成功 err = db.Ping() if err != nil { util.Log.Error("sql connection error:" + err.Error()) } Db = db } // 執(zhí)行增刪改操作 func ExecuteCUD(sql string, params ...interface{}) int64 { sql = jointSqlStr(sql, params...) conn, err := Db.Begin() if err != nil { util.Log.Error("Sql Error:" + err.Error()) return -1 } r, err := conn.Exec(sql) if err != nil { util.Log.Error("Sql Error:" + err.Error()) conn.Rollback() return -1 } id, err := r.LastInsertId() if err != nil { util.Log.Error("Sql Error:" + err.Error()) conn.Rollback() return -1 } conn.Commit() return id } // 執(zhí)行select all func ExecuteSelectAll(stc interface{}, sql string, params ...interface{}) error { sql = jointSqlStr(sql, params...) err := Db.Select(stc, sql) if err != nil { util.Log.Error("Sql Select Error:" + err.Error()) return err } return nil } // 1 5 | 0 5 // 2 5 | 5 5 // 3 5 | 10 5 func jointSqlStr(sqlStr string, args ...interface{}) string { // 以%s分割 strs := strings.Split(sqlStr, "%s") if len(strs) == 0 { return sqlStr } newSql := "" for i, _ := range strs { newSql += strs[i] if i != len(strs)-1 { switch args[i].(type) { case string: newSql += args[i].(string) break case int: newSql += fmt.Sprintf("%v", args[i].(int)) break case uint: newSql += fmt.Sprintf("%v", args[i].(uint)) break } } } return newSql }
page_util
通過(guò),page_util來(lái)封裝分頁(yè)相關(guān)操作。SelectPage(): 傳入我們查詢的數(shù)據(jù),響應(yīng)一個(gè)封裝好的PageResult結(jié)構(gòu)體。
package page import ( "back-me/main/model" "errors" "reflect" ) var PageError = errors.New("page or pageSize cannot be < 1") type Pager struct { Page int `json:"page"` PageSize int `json:"pageSize"` } func NewPager(page int, pageSize int) (*Pager, error) { if page < 1 || pageSize < 1 { return nil, PageError } return &Pager{ page, pageSize, }, nil } func (p *Pager) SelectPage(data interface{}) *model.PageResult { page := p.Page pageSize := p.PageSize page = (page - 1) * pageSize start := page end := page + pageSize l := reflect.ValueOf(data).Elem().Len() if l-1 < start { return model.NewPageResult1(nil, 0, page, pageSize) } else if l-1 >= start && l-1 <= end { return model.NewPageResult1(subData(data, start, l), l, p.Page, p.PageSize) } else { return model.NewPageResult1(subData(data, start, end), l, p.Page, p.PageSize) } } // 包前不包后 func subData(data any, start int, end int) interface{} { v := reflect.ValueOf(data) v = v.Elem() return v.Slice(start, end).Interface() }
result
分頁(yè)數(shù)據(jù)公共封裝響應(yīng)。
package model type PageResult struct { Data any `json:"data"` Code int `json:"code"` Mes string `json:"mes"` Total int `json:"total"` Page int `json:"page"` PageSize int `json:"pageSize"` } func NewPageResult(data any, code int, mes string, total int, page int, pageSize int) *PageResult { return &PageResult{ data, code, mes, total, page, pageSize, } } // NewPageResult1 func NewPageResult1(data any, total int, page int, pageSize int) *PageResult { return NewPageResult(data, 200, "ok", total, page, pageSize) }
測(cè)試
func TestSelectPage(t *testing.T) { var userVos []vo.User // 查詢出的數(shù)據(jù),最終封裝到這里面 var sqlStr = "SELECT * FROM `tx_user` WHERE PASSWORD LIKE '%s' LIMIT 0, 2" // %s 就是占位符,被后面?zhèn)魅氲膮?shù)替換 sql.ExecuteSelectAll(&userVos, sqlStr, "%") // 分頁(yè) // 0 1 // 2 3 // start < newPager, err := page.NewPager(1, 2) if err != nil { fmt.Println("error:", err.Error()) } pageResult := newPager.SelectPage(&userVos) fmt.Println(pageResult) }
總結(jié)
到此這篇關(guān)于如何通過(guò)go自定義一個(gè)分頁(yè)插件的文章就介紹到這了,更多相關(guān)go自定義分頁(yè)插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言import報(bào)錯(cuò)處理圖文詳解
今天本來(lái)想嘗試一下go語(yǔ)言中公有和私有的方法,結(jié)果import其他包的時(shí)候直接報(bào)錯(cuò)了,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言import報(bào)錯(cuò)處理的相關(guān)資料,需要的朋友可以參考下2023-04-04golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換的相關(guān)資料,在Go語(yǔ)言中string轉(zhuǎn)int是一項(xiàng)常見(jiàn)的操作,需要的朋友可以參考下2023-07-07go語(yǔ)言中使用ent做關(guān)聯(lián)查詢的示例詳解
go語(yǔ)言的ent框架是facebook開(kāi)源的ORM框架,是go語(yǔ)言開(kāi)發(fā)中的常用框架,而關(guān)聯(lián)查詢又是日常開(kāi)發(fā)中的常見(jiàn)數(shù)據(jù)庫(kù)操作,故文本給出一個(gè)使用ent做關(guān)聯(lián)查詢的使用示例,需要的朋友可以參考下2024-02-02Golang算法問(wèn)題之?dāng)?shù)組按指定規(guī)則排序的方法分析
這篇文章主要介紹了Golang算法問(wèn)題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下2017-02-02Go?語(yǔ)言開(kāi)發(fā)環(huán)境搭建過(guò)程
這篇文章主要介紹了Go?語(yǔ)言開(kāi)發(fā)環(huán)境搭建過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03