Skip to content

Commit 2bd6e64

Browse files
committed
增加pagehelper扩展性,增加数据库支持
1 parent 2dbd465 commit 2bd6e64

File tree

7 files changed

+272
-57
lines changed

7 files changed

+272
-57
lines changed

modifier.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package pagehelper
7+
8+
const (
9+
DriverDummy = "default"
10+
DriverMysql = "mysql"
11+
DriverPostgre = "postgre"
12+
DriverOracle = "oracle"
13+
DriverSqlServer = "sqlserver"
14+
)
15+
16+
type Modifier struct {
17+
OrderBy func(sql string, p *OrderByInfo) string
18+
Page func(sql string, p *PageInfo) string
19+
Count func(sql, countColumn string) string
20+
}
21+
22+
var DummyModifier = Modifier{
23+
OrderBy: DummyModifyOrderBy,
24+
Page: DummyModifyPage,
25+
Count: DummyModifyCount,
26+
}
27+
28+
func DummyModifyOrderBy(sql string, p *OrderByInfo) string {
29+
return sql
30+
}
31+
32+
func DummyModifyPage(sql string, p *PageInfo) string {
33+
return sql
34+
}
35+
36+
func DummyModifyCount(sql, countColumn string) string {
37+
return sql
38+
}

modifier_mysql.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package pagehelper
7+
8+
import (
9+
"fmt"
10+
"strings"
11+
)
12+
13+
var MysqlModifier = Modifier{
14+
OrderBy: MysqlModifyOrderBy,
15+
Page: MysqlModifyPage,
16+
Count: MysqlModifyCount,
17+
}
18+
19+
func MysqlModifyOrderBy(sql string, p *OrderByInfo) string {
20+
if p.Field == "" {
21+
return sql
22+
}
23+
b := strings.Builder{}
24+
b.WriteString(strings.TrimSpace(sql))
25+
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
26+
return b.String()
27+
}
28+
29+
func MysqlModifyPage(sql string, p *PageInfo) string {
30+
b := strings.Builder{}
31+
b.WriteString(strings.TrimSpace(sql))
32+
b.WriteString(fmt.Sprintf(" LIMIT %d, %d ", p.Page*p.PageSize, p.PageSize))
33+
return b.String()
34+
}
35+
36+
func MysqlModifyCount(sql, countColumn string) string {
37+
if countColumn == "" {
38+
countColumn = "0"
39+
} else {
40+
countColumn = "`" + countColumn + "`"
41+
}
42+
b := strings.Builder{}
43+
b.WriteString("SELECT COUNT(")
44+
b.WriteString(countColumn)
45+
b.WriteString(") FROM (")
46+
b.WriteString(strings.TrimSpace(sql))
47+
b.WriteString(") AS __hp_tempCountTl")
48+
return b.String()
49+
}

modifier_oracle.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package pagehelper
7+
8+
import (
9+
"fmt"
10+
"strings"
11+
)
12+
13+
var OracleModifier = Modifier{
14+
OrderBy: OracleModifyOrderBy,
15+
Page: OracleModifyPage,
16+
Count: OracleModifyCount,
17+
}
18+
19+
func OracleModifyOrderBy(sql string, p *OrderByInfo) string {
20+
if p.Field == "" {
21+
return sql
22+
}
23+
b := strings.Builder{}
24+
b.WriteString(strings.TrimSpace(sql))
25+
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
26+
return b.String()
27+
}
28+
29+
func OracleModifyPage(sql string, p *PageInfo) string {
30+
b := strings.Builder{}
31+
b.WriteString("SELECT * FROM ( ")
32+
b.WriteString(" SELECT __hp_tempPageTl.*, ROWNUM ROW_ID FROM ( ")
33+
b.WriteString(strings.TrimSpace(sql))
34+
b.WriteString(" ) __hp_tempPageTl)")
35+
b.WriteString(fmt.Sprintf(" WHERE ROW_ID <= %d AND ROW_ID > %d ", p.Page*p.PageSize, p.PageSize))
36+
return b.String()
37+
}
38+
39+
func OracleModifyCount(sql, countColumn string) string {
40+
if countColumn == "" {
41+
countColumn = "0"
42+
} else {
43+
countColumn = "`" + countColumn + "`"
44+
}
45+
b := strings.Builder{}
46+
b.WriteString("SELECT COUNT(")
47+
b.WriteString(countColumn)
48+
b.WriteString(") FROM (")
49+
b.WriteString(strings.TrimSpace(sql))
50+
b.WriteString(") AS __hp_tempCountTl")
51+
return b.String()
52+
}

modifier_postgre.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package pagehelper
7+
8+
import (
9+
"fmt"
10+
"strings"
11+
)
12+
13+
var PostgreModifier = Modifier{
14+
OrderBy: PostgreModifyOrderBy,
15+
Page: PostgreModifyPage,
16+
Count: PostgreModifyCount,
17+
}
18+
19+
func PostgreModifyOrderBy(sql string, p *OrderByInfo) string {
20+
if p.Field == "" {
21+
return sql
22+
}
23+
b := strings.Builder{}
24+
b.WriteString(strings.TrimSpace(sql))
25+
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
26+
return b.String()
27+
}
28+
29+
func PostgreModifyPage(sql string, p *PageInfo) string {
30+
b := strings.Builder{}
31+
b.WriteString(strings.TrimSpace(sql))
32+
b.WriteString(fmt.Sprintf(" OFFSET %d LIMIT %d ", p.Page*p.PageSize, p.PageSize))
33+
return b.String()
34+
}
35+
36+
func PostgreModifyCount(sql, countColumn string) string {
37+
if countColumn == "" {
38+
countColumn = "0"
39+
} else {
40+
countColumn = "`" + countColumn + "`"
41+
}
42+
b := strings.Builder{}
43+
b.WriteString("SELECT COUNT(")
44+
b.WriteString(countColumn)
45+
b.WriteString(") FROM (")
46+
b.WriteString(strings.TrimSpace(sql))
47+
b.WriteString(") AS __hp_tempCountTl")
48+
return b.String()
49+
}

modifier_sqlserver.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (C) 2019-2020, Xiongfa Li.
2+
// @author xiongfa.li
3+
// @version V1.0
4+
// Description:
5+
6+
package pagehelper
7+
8+
import (
9+
"fmt"
10+
"strings"
11+
)
12+
13+
var SqlServerModifier = Modifier{
14+
OrderBy: SqlServerModifyOrderBy,
15+
Page: SqlServerModifyPage,
16+
Count: SqlServerModifyCount,
17+
}
18+
19+
func SqlServerModifyOrderBy(sql string, p *OrderByInfo) string {
20+
if p.Field == "" {
21+
return sql
22+
}
23+
b := strings.Builder{}
24+
b.WriteString(strings.TrimSpace(sql))
25+
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
26+
return b.String()
27+
}
28+
29+
func SqlServerModifyPage(sql string, p *PageInfo) string {
30+
b := strings.Builder{}
31+
b.WriteString(strings.TrimSpace(sql))
32+
b.WriteString(fmt.Sprintf(" OFFSET %d ROWS FETCH NEXT %d ROWS ONLY ", p.Page*p.PageSize, p.PageSize))
33+
return b.String()
34+
}
35+
36+
func SqlServerModifyCount(sql, countColumn string) string {
37+
if countColumn == "" {
38+
countColumn = "0"
39+
} else {
40+
countColumn = "`" + countColumn + "`"
41+
}
42+
b := strings.Builder{}
43+
b.WriteString("SELECT COUNT(")
44+
b.WriteString(countColumn)
45+
b.WriteString(") FROM (")
46+
b.WriteString(strings.TrimSpace(sql))
47+
b.WriteString(") AS __hp_tempCountTl")
48+
return b.String()
49+
}

orm.go

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/xfali/gobatis/reflection"
1818
"github.com/xfali/gobatis/session"
1919
"github.com/xfali/gobatis/transaction"
20-
"strings"
2120
)
2221

2322
const (
@@ -28,19 +27,15 @@ const (
2827
DESC = "DESC"
2928
)
3029

31-
var (
32-
OrderByModifier = modifyOrderSql
33-
PageModifier = modifyPageSql
34-
CountModifier = modifyCountSql
35-
)
36-
3730
type Factory struct {
3831
fac factory.Factory
3932
}
4033

4134
type Executor struct {
4235
exec executor.Executor
4336
log logging.LogFunc
37+
38+
modifier Modifier
4439
}
4540

4641
func New(f factory.Factory) *Factory {
@@ -72,14 +67,14 @@ func (exec *Executor) Query(ctx context.Context, result reflection.Object, sql s
7267
o := ctx.Value(orderHelperValue)
7368
if o != nil {
7469
if param, ok := o.(*OrderByInfo); ok {
75-
sql = OrderByModifier(sql, param)
70+
sql = exec.modifier.OrderBy(sql, param)
7671
}
7772
}
7873

7974
p := ctx.Value(pageHelperValue)
8075
if p != nil {
8176
if param, ok := p.(*PageInfo); ok {
82-
sql = PageModifier(sql, param)
77+
sql = exec.modifier.Page(sql, param)
8378
if param.total == -1 {
8479
param.total = exec.getTotal(ctx, originSql, param.countColumn, params...)
8580
}
@@ -111,31 +106,20 @@ func (f *Factory) LogFunc() logging.LogFunc {
111106
}
112107

113108
func (f *Factory) CreateExecutor(transaction transaction.Transaction) executor.Executor {
114-
return &Executor{
115-
exec: executor.NewSimpleExecutor(transaction),
116-
log: f.LogFunc(),
109+
driver := ""
110+
if defaultFac, ok := f.fac.(*factory.DefaultFactory); ok {
111+
driver = defaultFac.DataSource.DriverName()
117112
}
118-
}
119113

120-
func modifyOrderSql(sql string, p *OrderByInfo) string {
121-
if p.Field == "" {
122-
return sql
114+
return &Executor{
115+
exec: executor.NewSimpleExecutor(transaction),
116+
log: f.LogFunc(),
117+
modifier: SelectModifier(driver),
123118
}
124-
b := strings.Builder{}
125-
b.WriteString(strings.TrimSpace(sql))
126-
b.WriteString(fmt.Sprintf(" ORDER BY `%s` %s ", p.Field, p.Order))
127-
return b.String()
128-
}
129-
130-
func modifyPageSql(sql string, p *PageInfo) string {
131-
b := strings.Builder{}
132-
b.WriteString(strings.TrimSpace(sql))
133-
b.WriteString(fmt.Sprintf(" LIMIT %d, %d ", p.Page*p.PageSize, p.PageSize))
134-
return b.String()
135119
}
136120

137121
func (exec *Executor) getTotal(ctx context.Context, sql, countColumn string, params ...interface{}) int64 {
138-
totalSql := CountModifier(sql, countColumn)
122+
totalSql := exec.modifier.Count(sql, countColumn)
139123
var total int64
140124
obj, err := gobatis.ParseObject(&total)
141125
if err == nil {
@@ -145,17 +129,23 @@ func (exec *Executor) getTotal(ctx context.Context, sql, countColumn string, par
145129
return 0
146130
}
147131

148-
func modifyCountSql(sql, countColumn string) string {
149-
if countColumn == "" {
150-
countColumn = "0"
151-
} else {
152-
countColumn = "`" + countColumn + "`"
132+
var modifierMap = map[string]Modifier{
133+
DriverDummy: DummyModifier,
134+
DriverMysql: MysqlModifier,
135+
DriverOracle: OracleModifier,
136+
DriverPostgre: PostgreModifier,
137+
DriverSqlServer: SqlServerModifier,
138+
}
139+
140+
func RegisterModifier(driver string, m Modifier) {
141+
if driver != "" {
142+
modifierMap[driver] = m
143+
}
144+
}
145+
146+
func SelectModifier(driver string) Modifier {
147+
if m, ok := modifierMap[driver]; ok {
148+
return m
153149
}
154-
b := strings.Builder{}
155-
b.WriteString("SELECT COUNT(")
156-
b.WriteString(countColumn)
157-
b.WriteString(") FROM (")
158-
b.WriteString(strings.TrimSpace(sql))
159-
b.WriteString(") AS __hp_tempCountTl")
160-
return b.String()
150+
return modifierMap[DriverDummy]
161151
}

0 commit comments

Comments
 (0)