如何通過go自定義一個(gè)分頁插件
建議看這個(gè)之前,先看看這個(gè):go操作MySQL · Go語言中文文檔 (topgoer.com)
嗯...也不能叫做分頁插件,就是一個(gè)分頁工具類。
下載依賴
go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx
sql_util
我們自定義一個(gè)sql_util,用來封裝數(shù)據(jù)庫連接操作。ExecuteCUD()執(zhí)行增刪改操作。ExecuteSelectAll()執(zhí)行查詢操作。目前沒有查詢單個(gè)的,而且查詢到全部數(shù)據(jù),判斷查詢數(shù)據(jù)長度即可。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ù)庫
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
通過,page_util來封裝分頁相關(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
分頁數(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)
}
測試
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, "%")
// 分頁
// 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)于如何通過go自定義一個(gè)分頁插件的文章就介紹到這了,更多相關(guān)go自定義分頁插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之字符串與int、int64類型互相轉(zhuǎn)換的相關(guān)資料,在Go語言中string轉(zhuǎn)int是一項(xiàng)常見的操作,需要的朋友可以參考下2023-07-07
go語言中使用ent做關(guān)聯(lián)查詢的示例詳解
go語言的ent框架是facebook開源的ORM框架,是go語言開發(fā)中的常用框架,而關(guān)聯(lián)查詢又是日常開發(fā)中的常見數(shù)據(jù)庫操作,故文本給出一個(gè)使用ent做關(guān)聯(lián)查詢的使用示例,需要的朋友可以參考下2024-02-02
Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法分析
這篇文章主要介紹了Golang算法問題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下2017-02-02

