Skip to content

Commit 307baa4

Browse files
committed
增加获得PageInfo方式
1 parent 43fafb3 commit 307baa4

File tree

6 files changed

+315
-178
lines changed

6 files changed

+315
-178
lines changed

README.md

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ pagehelper是与[gobatis](https://github.com/xfali/gobatis)配套的分页工具
66

77
## 待完成项
88

9-
select查询返回的result还未能携带page、pageSize、total信息,需要自己组装。
9+
v0.1.0已添加此特性 :返回总记录数
1010

11-
(此功能需gobatis支持,暂未实现)
11+
~~select查询返回的result还未能携带page、pageSize、total信息,需要自己组装。~~
1212

1313
## 使用
1414

@@ -35,21 +35,49 @@ select查询返回的result还未能携带page、pageSize、total信息,需要
3535
### 2、配置分页参数
3636
```cassandraql
3737
session := sessMgr.NewSession()
38-
ctx := pagehelper.StartPage(1, 10, context.Background())
38+
ctx := pagehelper.StartPage(context.Background(), 1, 10)
3939
4040
var ret []TestTable
4141
session.SetContext(ctx).Select("SELECT * FROM TBL_TEST").Param().Result(&ret)
4242
```
4343

44-
### 3、配置排序参数
44+
### 3、配置分页参数(带自动统计总记录数功能)
45+
```$xslt
46+
session := sessMgr.NewSession()
47+
ctx := pagehelper.StartPageWithCount(context.Background(), 1, 10, "")
48+
49+
var ret []TestTable
50+
session.SetContext(ctx).Select("SELECT * FROM TBL_TEST").Param().Result(&ret)
51+
```
52+
获得分页信息(以1001条记录为例)
53+
```$xslt
54+
pageInfo := pagehelper.GetPageInfo(ctx)
55+
t.Log(
56+
"pageNum: ", pageInfo.GetPageNum(),
57+
"totalPage: ", pageInfo.GetTotalPage(),
58+
"pageSize: ", pageInfo.GetPageSize(),
59+
"total: ", pageInfo.GetTotal())
60+
```
61+
输出:
62+
```$xslt
63+
pageNum: 1
64+
GetPages: 101
65+
GetPageSize: 10
66+
total: 1001
67+
```
68+
*注意:*
69+
70+
会自动生成和执行带子查询的countSQL,请自行评估是否使用此功能,转而使用自定义SQL获取总记录数。
71+
72+
### 4、配置排序参数
4573
```cassandraql
4674
session := sessMgr.NewSession()
47-
ctx := pagehelper.OrderBy("myfield", pagehelper.DESC, context.Background())
75+
ctx := pagehelper.OrderBy(context.Background(), "myfield", pagehelper.DESC)
4876
4977
var ret []TestTable
5078
session.SetContext(ctx).Select("SELECT * FROM TBL_TEST").Param().Result(&ret)
5179
```
52-
*注意:*
80+
*注意*
5381

5482
由于golang对order by不能使用placeholder的方式,所以存在注入风险,请谨慎使用排序功能,如果使用,则需要自己做防注入的工作。
5583

@@ -63,10 +91,10 @@ if !valid.MatchString(ordCol) {
6391
}
6492
```
6593

66-
### 4、使用builder
94+
### 5、使用builder
6795
```$xslt
6896
session := sessMgr.NewSession()
69-
ctx := pagehelper.C(context.Background()).Page(1, 3).Order("test", pagehelper.ASC).Build()
97+
ctx := pagehelper.C(context.Background()).Page(1, 3).OrderBy("test", pagehelper.ASC).Build()
7098
var ret []TestTable
7199
session.SetContext(ctx).Select("SELECT * FROM TBL_TEST").Param().Result(&ret)
72100
```

builder.go

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ package pagehelper
99
import "context"
1010

1111
type builder struct {
12+
page PageInfo
13+
order OrderByInfo
14+
1215
ctx context.Context
1316
}
1417

@@ -22,41 +25,67 @@ func C(ctx context.Context) *builder {
2225
//page 页码
2326
//pageSize 分页大小
2427
func (b *builder) Page(page, pageSize int) *builder {
25-
b.ctx = StartPage(page, pageSize, b.ctx)
28+
b.page.Page = page
29+
b.page.PageSize = pageSize
30+
b.page.total = 0
2631
return b
2732
}
2833

2934
//分页
3035
//page 页码
3136
//pageSize 分页大小
32-
func (b *builder) PageWithTotal(page, pageSize int, countColumn string) *builder {
33-
b.ctx = StartPageWithTotal(page, pageSize, countColumn, b.ctx)
37+
func (b *builder) PageWithCount(page, pageSize int, countColumn string) *builder {
38+
b.page.Page = page
39+
b.page.PageSize = pageSize
40+
b.page.countColumn = countColumn
41+
b.page.total = -1
42+
return b
43+
}
44+
45+
func (b *builder) Total(countColumn string) *builder {
46+
b.page.countColumn = countColumn
47+
b.page.total = -1
3448
return b
3549
}
3650

3751
//手动指定字段和排序
3852
//field 字段
3953
//order 排序 [ASC | DESC]
4054
func (b *builder) Order(field, order string) *builder {
41-
b.ctx = OrderBy(field, order, b.ctx)
55+
b.order.Field = field
56+
b.order.Order = order
4257
return b
4358
}
4459

4560
//升序(默认)
4661
//field 字段
4762
func (b *builder) ASC(field string) *builder {
48-
b.ctx = OrderBy(field, ASC, b.ctx)
49-
return b
63+
return b.Order(field, ASC)
5064
}
5165

5266
//降序
5367
//field 字段
5468
func (b *builder) DESC(field string) *builder {
55-
b.ctx = OrderBy(field, DESC, b.ctx)
56-
return b
69+
return b.Order(field, DESC)
5770
}
5871

5972
//获得含分页/排序信息的context
6073
func (b *builder) Build() context.Context {
74+
if b.page.PageSize > 0 {
75+
if b.page.total != -1 {
76+
b.ctx = StartPage(b.ctx, b.page.Page, b.page.PageSize)
77+
} else {
78+
b.ctx = StartPageWithCount(b.ctx, b.page.Page, b.page.PageSize, b.page.countColumn)
79+
}
80+
}
81+
82+
if b.order.Field != "" {
83+
if b.order.Order == "" {
84+
b.order.Order = ASC
85+
}
86+
87+
b.ctx = OrderBy(b.ctx, b.order.Field, b.order.Order)
88+
}
89+
6190
return b.ctx
6291
}

orm.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// Copyright (C) 2019, Xiongfa Li.
2+
// All right reserved.
3+
// @author xiongfa.li
4+
// @version V1.0
5+
// Description:
6+
7+
package pagehelper
8+
9+
import (
10+
"context"
11+
"fmt"
12+
"github.com/xfali/gobatis"
13+
"github.com/xfali/gobatis/common"
14+
"github.com/xfali/gobatis/executor"
15+
"github.com/xfali/gobatis/factory"
16+
"github.com/xfali/gobatis/logging"
17+
"github.com/xfali/gobatis/reflection"
18+
"github.com/xfali/gobatis/session"
19+
"github.com/xfali/gobatis/transaction"
20+
"strings"
21+
)
22+
23+
const (
24+
pageHelperValue = "_page_helper_value"
25+
orderHelperValue = "_order_helper_value"
26+
27+
ASC = "ASC"
28+
DESC = "DESC"
29+
)
30+
31+
var (
32+
OrderByModifier = modifyOrderSql
33+
PageModifier = modifyPageSql
34+
CountModifier = modifyCountSql
35+
)
36+
37+
type Factory struct {
38+
fac factory.Factory
39+
}
40+
41+
type Executor struct {
42+
exec executor.Executor
43+
log logging.LogFunc
44+
}
45+
46+
func New(f factory.Factory) *Factory {
47+
return &Factory{f}
48+
}
49+
50+
func (exec *Executor) Close(rollback bool) {
51+
exec.exec.Close(rollback)
52+
}
53+
54+
func (exec *Executor) Exec(ctx context.Context, sql string, params ...interface{}) (common.Result, error) {
55+
return exec.exec.Exec(ctx, sql, params...)
56+
}
57+
58+
func (exec *Executor) Begin() error {
59+
return exec.exec.Begin()
60+
}
61+
62+
func (exec *Executor) Commit(require bool) error {
63+
return exec.exec.Commit(require)
64+
}
65+
66+
func (exec *Executor) Rollback(require bool) error {
67+
return exec.exec.Rollback(require)
68+
}
69+
70+
func (exec *Executor) Query(ctx context.Context, result reflection.Object, sql string, params ...interface{}) error {
71+
originSql := sql
72+
o := ctx.Value(orderHelperValue)
73+
if o != nil {
74+
if param, ok := o.(*OrderByInfo); ok {
75+
sql = OrderByModifier(sql, param)
76+
}
77+
}
78+
79+
p := ctx.Value(pageHelperValue)
80+
if p != nil {
81+
if param, ok := p.(*PageInfo); ok {
82+
sql = PageModifier(sql, param)
83+
if param.total == -1 {
84+
param.total = exec.getTotal(ctx, originSql, param.countColumn, params...)
85+
}
86+
}
87+
}
88+
exec.log(logging.DEBUG, "PageHelper Query: [%s], params: %s\n", sql, fmt.Sprint(params))
89+
return exec.exec.Query(ctx, result, sql, params...)
90+
}
91+
92+
func (f *Factory) InitDB() error {
93+
return f.fac.InitDB()
94+
}
95+
96+
func (f *Factory) CreateTransaction() transaction.Transaction {
97+
return f.fac.CreateTransaction()
98+
}
99+
100+
func (f *Factory) CreateSession() session.SqlSession {
101+
tx := f.CreateTransaction()
102+
return session.NewDefaultSqlSession(f.LogFunc(), tx, f.CreateExecutor(tx), false)
103+
}
104+
105+
func (f *Factory) LogFunc() logging.LogFunc {
106+
return f.fac.LogFunc()
107+
}
108+
109+
func (f *Factory) CreateExecutor(transaction transaction.Transaction) executor.Executor {
110+
return &Executor{
111+
exec: executor.NewSimpleExecutor(transaction),
112+
log: f.LogFunc(),
113+
}
114+
}
115+
116+
func modifyOrderSql(sql string, p *OrderByInfo) string {
117+
if p.Field == "" {
118+
return sql
119+
}
120+
b := strings.Builder{}
121+
b.WriteString(strings.TrimSpace(sql))
122+
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
123+
return b.String()
124+
}
125+
126+
func modifyPageSql(sql string, p *PageInfo) string {
127+
b := strings.Builder{}
128+
b.WriteString(strings.TrimSpace(sql))
129+
b.WriteString(fmt.Sprintf(" LIMIT %d, %d ", p.Page*p.PageSize, p.PageSize))
130+
return b.String()
131+
}
132+
133+
func (exec *Executor) getTotal(ctx context.Context, sql, countColumn string, params ...interface{}) int64 {
134+
totalSql := CountModifier(sql, countColumn)
135+
var total int64
136+
obj, err := gobatis.ParseObject(&total)
137+
if err == nil {
138+
exec.exec.Query(ctx, obj, totalSql, params...)
139+
return total
140+
}
141+
return 0
142+
}
143+
144+
func modifyCountSql(sql, countColumn string) string {
145+
if countColumn == "" {
146+
countColumn = "0"
147+
} else {
148+
countColumn = "`" + countColumn + "`"
149+
}
150+
b := strings.Builder{}
151+
b.WriteString("SELECT COUNT(")
152+
b.WriteString(countColumn)
153+
b.WriteString(") FROM (")
154+
b.WriteString(strings.TrimSpace(sql))
155+
b.WriteString(") AS __hp_tempCountTl")
156+
return b.String()
157+
}

0 commit comments

Comments
 (0)