建议看这个之前,先看看这个:go操作mysql · go语言中文文档 (topgoer.com)
嗯...也不能叫做分页插件,就是一个分页工具类。
下载依赖
go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx
sql_util
我们自定义一个sql_util,用来封装数据库连接操作。executecud()执行增删改操作。executeselectall()执行查询操作。目前没有查询单个的,而且查询到全部数据,判断查询数据长度即可。jointsqlstr() : 负责拼接sql字符串模版和动态绑定的参数
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()
}
// 连接数据库
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
}
// 执行增删改操作
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
}
// 执行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来封装分页相关操作。selectpage(): 传入我们查询的数据,响应一个封装好的pageresult结构体。
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
分页数据公共封装响应。
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 // 查询出的数据,最终封装到这里面
var sqlstr = "select * from `tx_user` where password like '%s' limit 0, 2" // %s 就是占位符,被后面传入的参数替换
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)
}总结
到此这篇关于如何通过go自定义一个分页插件的文章就介绍到这了,更多相关go自定义分页插件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论