1+ /*
2+ * Copyright (c) 2022, AcmeStack
3+ * All rights reserved.
4+ *
5+ * Licensed under the Apache License, Version 2.0 (the "License");
6+ * you may not use this file except in compliance with the License.
7+ * You may obtain a copy of the License at
8+ *
9+ * http://www.apache.org/licenses/LICENSE-2.0
10+ *
11+ * Unless required by applicable law or agreed to in writing, software
12+ * distributed under the License is distributed on an "AS IS" BASIS,
13+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+ * See the License for the specific language governing permissions and
15+ * limitations under the License.
16+ */
17+
118package mapper
219
320import (
421 "context"
522 "github.com/acmestack/gobatis"
23+ "github.com/acmestack/gobatis-plus/pkg/constants"
24+ "reflect"
25+ "strconv"
26+ "strings"
27+ "time"
628)
729
830type BaseMapper [T any ] struct {
9- SessMgr * gobatis.SessionManager
10- Ctx context.Context
11- Columns []string
31+ SessMgr * gobatis.SessionManager
32+ Ctx context.Context
33+ Columns []string
34+ ParamNameSeq int
1235}
1336
14- func (userMapper * BaseMapper [T ]) Insert (entity T ) int64 {
37+ type BuildSqlFunc func (columns string , tableName string ) string
38+
39+ func (userMapper * BaseMapper [T ]) Save (entity T ) int64 {
1540 return 0
1641}
1742
18- func (userMapper * BaseMapper [T ]) InsertBatch (entities ... T ) (int64 , int64 ) {
43+ func (userMapper * BaseMapper [T ]) SaveBatch (entities ... T ) (int64 , int64 ) {
1944 return 0 , 0
2045}
2146func (userMapper * BaseMapper [T ]) DeleteById (id any ) int64 {
@@ -27,30 +52,205 @@ func (userMapper *BaseMapper[T]) DeleteBatchIds(ids []any) int64 {
2752func (userMapper * BaseMapper [T ]) UpdateById (entity T ) int64 {
2853 return 0
2954}
30- func (userMapper * BaseMapper [T ]) SelectById (id any ) T {
31- return * new (T )
55+ func (userMapper * BaseMapper [T ]) SelectById (id any ) (T , error ) {
56+ queryWrapper := userMapper .init (nil )
57+ queryWrapper .Eq (constants .ID , strconv .Itoa (id .(int )))
58+ columns := userMapper .buildSelectColumns (queryWrapper )
59+
60+ sqlId , sql , paramMap := userMapper .buildSelectSql (queryWrapper , columns , buildSelectSqlFirstPart )
61+
62+ var entity T
63+ err := gobatis .RegisterSql (sqlId , sql )
64+ if err != nil {
65+ return entity , err
66+ }
67+
68+ sess := userMapper .SessMgr .NewSession ()
69+
70+ err = sess .Select (sqlId ).Param (paramMap ).Result (& entity )
71+ if err != nil {
72+ return entity , err
73+ }
74+
75+ // delete sqlId
76+ gobatis .UnregisterSql (sqlId )
77+
78+ return entity , nil
3279}
33- func (userMapper * BaseMapper [T ]) SelectBatchIds (ids []any ) []T {
80+ func (userMapper * BaseMapper [T ]) SelectBatchIds (ids []any ) ([]T , error ) {
81+ tableName := userMapper .getTableName ()
82+ sqlFirstPart := buildSelectSqlFirstPart (constants .ASTERISK , tableName )
83+ var paramMap = map [string ]any {}
84+ build := strings.Builder {}
85+ build .WriteString (constants .SPACE + constants .WHERE + constants .SPACE + constants .ID +
86+ constants .SPACE + constants .In + constants .LEFT_BRACKET + constants .SPACE )
87+ for index , id := range ids {
88+ mapping := userMapper .getMappingSeq ()
89+ paramMap [mapping ] = strconv .Itoa (id .(int ))
90+ if index == len (ids )- 1 {
91+ build .WriteString (constants .HASH_LEFT_BRACE + mapping + constants .RIGHT_BRACE )
92+ } else {
93+ build .WriteString (constants .HASH_LEFT_BRACE + mapping + constants .RIGHT_BRACE + constants .COMMA )
94+ }
95+ }
96+ build .WriteString (constants .SPACE + constants .RIGHT_BRACKET )
97+ sqlId := buildSqlId (constants .SELECT )
98+ sql := sqlFirstPart + build .String ()
99+
100+ err := gobatis .RegisterSql (sqlId , sql )
101+ if err != nil {
102+ return nil , err
103+ }
104+
105+ sess := userMapper .SessMgr .NewSession ()
34106 var arr []T
35- return arr
107+ err = sess .Select (sqlId ).Param (paramMap ).Result (& arr )
108+ if err != nil {
109+ return nil , err
110+ }
111+ return arr , nil
36112}
37- func (userMapper * BaseMapper [T ]) SelectOne (entity T ) T {
38- return * new (T )
113+
114+ func (userMapper * BaseMapper [T ]) getMappingSeq () string {
115+ userMapper .ParamNameSeq = userMapper .ParamNameSeq + 1
116+ mapping := constants .MAPPING + strconv .Itoa (userMapper .ParamNameSeq )
117+ return mapping
39118}
40- func (userMapper * BaseMapper [T ]) SelectCount (entity T ) int64 {
41- return 0
119+
120+ func (userMapper * BaseMapper [T ]) SelectOne (queryWrapper * QueryWrapper [T ]) (T , error ) {
121+ queryWrapper = userMapper .init (queryWrapper )
122+
123+ columns := userMapper .buildSelectColumns (queryWrapper )
124+
125+ sqlId , sql , paramMap := userMapper .buildSelectSql (queryWrapper , columns , buildSelectSqlFirstPart )
126+
127+ var entity T
128+ err := gobatis .RegisterSql (sqlId , sql )
129+ if err != nil {
130+ return entity , err
131+ }
132+
133+ sess := userMapper .SessMgr .NewSession ()
134+
135+ err = sess .Select (sqlId ).Param (paramMap ).Result (& entity )
136+ if err != nil {
137+ return entity , err
138+ }
139+
140+ // delete sqlId
141+ gobatis .UnregisterSql (sqlId )
142+ return entity , nil
143+ }
144+
145+ func (userMapper * BaseMapper [T ]) SelectCount (queryWrapper * QueryWrapper [T ]) (int64 , error ) {
146+ queryWrapper = userMapper .init (queryWrapper )
147+
148+ sqlId , sql , paramMap := userMapper .buildSelectSql (queryWrapper , constants .COUNT , buildSelectSqlFirstPart )
149+
150+ err := gobatis .RegisterSql (sqlId , sql )
151+ if err != nil {
152+ return 0 , err
153+ }
154+
155+ sess := userMapper .SessMgr .NewSession ()
156+ var count int64
157+ err = sess .Select (sqlId ).Param (paramMap ).Result (& count )
158+ if err != nil {
159+ return 0 , err
160+ }
161+
162+ return count , nil
42163}
43164
44165func (userMapper * BaseMapper [T ]) SelectList (queryWrapper * QueryWrapper [T ]) ([]T , error ) {
45- if queryWrapper == nil {
46- queryWrapper = & QueryWrapper [T ]{}
47- queryWrapper .init ()
166+ queryWrapper = userMapper .init (queryWrapper )
167+
168+ columns := userMapper .buildSelectColumns (queryWrapper )
169+
170+ sqlId , sql , paramMap := userMapper .buildSelectSql (queryWrapper , columns , buildSelectSqlFirstPart )
171+
172+ err := gobatis .RegisterSql (sqlId , sql )
173+ if err != nil {
174+ return nil , err
48175 }
176+
49177 sess := userMapper .SessMgr .NewSession ()
50178 var arr []T
51- err : = sess .Select (queryWrapper . SqlBuild . String ()) .Param (queryWrapper . Entity ).Result (& arr )
179+ err = sess .Select (sqlId ) .Param (paramMap ).Result (& arr )
52180 if err != nil {
53181 return nil , err
54182 }
183+
184+ // delete sqlId
185+ gobatis .UnregisterSql (sqlId )
55186 return arr , nil
56187}
188+
189+ func (userMapper * BaseMapper [T ]) buildSelectColumns (queryWrapper * QueryWrapper [T ]) string {
190+ var columns string
191+ if len (queryWrapper .Columns ) > 0 {
192+ columns = strings .Join (queryWrapper .Columns , "," )
193+ } else {
194+ columns = constants .ASTERISK
195+ }
196+ return columns
197+ }
198+
199+ func (userMapper * BaseMapper [T ]) init (queryWrapper * QueryWrapper [T ]) * QueryWrapper [T ] {
200+ if queryWrapper == nil {
201+ queryWrapper = & QueryWrapper [T ]{}
202+ }
203+ return queryWrapper
204+ }
205+
206+ func (userMapper * BaseMapper [T ]) buildCondition (queryWrapper * QueryWrapper [T ]) (string , map [string ]any ) {
207+ var paramMap = map [string ]any {}
208+ expression := queryWrapper .Expression
209+ build := strings.Builder {}
210+ for _ , v := range expression {
211+ if paramValue , ok := v .(ParamValue ); ok {
212+ mapping := userMapper .getMappingSeq ()
213+ paramMap [mapping ] = paramValue .value
214+ build .WriteString (constants .HASH_LEFT_BRACE + mapping + constants .RIGHT_BRACE + constants .SPACE )
215+ } else {
216+ build .WriteString (v .(string ) + constants .SPACE )
217+ }
218+ }
219+ return build .String (), paramMap
220+ }
221+
222+ func (userMapper * BaseMapper [T ]) buildSelectSql (queryWrapper * QueryWrapper [T ], columns string , buildSqlFunc BuildSqlFunc ) (string , string , map [string ]any ) {
223+
224+ sqlCondition , paramMap := userMapper .buildCondition (queryWrapper )
225+
226+ tableName := userMapper .getTableName ()
227+
228+ sqlId := buildSqlId (constants .SELECT )
229+
230+ sqlFirstPart := buildSqlFunc (columns , tableName )
231+
232+ var sql string
233+ if len (queryWrapper .Expression ) > 0 {
234+ sql = sqlFirstPart + constants .SPACE + constants .WHERE + constants .SPACE + sqlCondition
235+ } else {
236+ sql = sqlFirstPart
237+ }
238+
239+ return sqlId , sql , paramMap
240+ }
241+
242+ func (userMapper * BaseMapper [T ]) getTableName () string {
243+ entityRef := reflect .TypeOf (new (T )).Elem ()
244+ tableNameTag := entityRef .Field (0 ).Tag
245+ tableName := string (tableNameTag )
246+ return tableName
247+ }
248+
249+ func buildSqlId (sqlType string ) string {
250+ sqlId := sqlType + constants .CONNECTION + strconv .Itoa (time .Now ().Nanosecond ())
251+ return sqlId
252+ }
253+
254+ func buildSelectSqlFirstPart (columns string , tableName string ) string {
255+ return constants .SELECT + constants .SPACE + columns + constants .SPACE + constants .FROM + constants .SPACE + tableName
256+ }
0 commit comments