View Javadoc
1   /*
2    *    Copyright 2016-2025 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.dynamic.sql.util.mybatis3;
17  
18  import java.util.Collection;
19  import java.util.List;
20  import java.util.function.Function;
21  import java.util.function.ToIntBiFunction;
22  import java.util.function.ToIntFunction;
23  import java.util.function.ToLongFunction;
24  import java.util.function.UnaryOperator;
25  
26  import org.mybatis.dynamic.sql.BasicColumn;
27  import org.mybatis.dynamic.sql.SqlBuilder;
28  import org.mybatis.dynamic.sql.SqlTable;
29  import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter;
30  import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
31  import org.mybatis.dynamic.sql.insert.GeneralInsertDSL;
32  import org.mybatis.dynamic.sql.insert.InsertDSL;
33  import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL;
34  import org.mybatis.dynamic.sql.insert.render.GeneralInsertStatementProvider;
35  import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
36  import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider;
37  import org.mybatis.dynamic.sql.render.RenderingStrategies;
38  import org.mybatis.dynamic.sql.select.CountDSL;
39  import org.mybatis.dynamic.sql.select.CountDSLCompleter;
40  import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
41  import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
42  import org.mybatis.dynamic.sql.select.SelectModel;
43  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
44  import org.mybatis.dynamic.sql.update.UpdateDSLCompleter;
45  import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
46  
47  /**
48   * Utility functions for building MyBatis3 mappers.
49   *
50   * @author Jeff Butler
51   */
52  public class MyBatis3Utils {
53      private MyBatis3Utils() {}
54  
55      public static long count(ToLongFunction<SelectStatementProvider> mapper, BasicColumn column, SqlTable table,
56              CountDSLCompleter completer) {
57          return mapper.applyAsLong(count(column, table, completer));
58      }
59  
60      public static SelectStatementProvider count(BasicColumn column, SqlTable table, CountDSLCompleter completer) {
61          return countFrom(SqlBuilder.countColumn(column).from(table), completer);
62      }
63  
64      public static long countDistinct(ToLongFunction<SelectStatementProvider> mapper, BasicColumn column, SqlTable table,
65              CountDSLCompleter completer) {
66          return mapper.applyAsLong(countDistinct(column, table, completer));
67      }
68  
69      public static SelectStatementProvider countDistinct(BasicColumn column, SqlTable table,
70              CountDSLCompleter completer) {
71          return countFrom(SqlBuilder.countDistinctColumn(column).from(table), completer);
72      }
73  
74      public static SelectStatementProvider countFrom(SqlTable table, CountDSLCompleter completer) {
75          return countFrom(SqlBuilder.countFrom(table), completer);
76      }
77  
78      public static long countFrom(ToLongFunction<SelectStatementProvider> mapper,
79              SqlTable table, CountDSLCompleter completer) {
80          return mapper.applyAsLong(countFrom(table, completer));
81      }
82  
83      public static SelectStatementProvider countFrom(CountDSL<SelectModel> start, CountDSLCompleter completer) {
84          return completer.apply(start)
85                  .build()
86                  .render(RenderingStrategies.MYBATIS3);
87      }
88  
89      public static long countFrom(ToLongFunction<SelectStatementProvider> mapper,
90              CountDSL<SelectModel> start, CountDSLCompleter completer) {
91          return mapper.applyAsLong(countFrom(start, completer));
92      }
93  
94      public static DeleteStatementProvider deleteFrom(SqlTable table, DeleteDSLCompleter completer) {
95          return completer.apply(SqlBuilder.deleteFrom(table))
96                  .build()
97                  .render(RenderingStrategies.MYBATIS3);
98      }
99  
100     public static int deleteFrom(ToIntFunction<DeleteStatementProvider> mapper,
101             SqlTable table, DeleteDSLCompleter completer) {
102         return mapper.applyAsInt(deleteFrom(table, completer));
103     }
104 
105     public static <R> InsertStatementProvider<R> insert(R row, SqlTable table,
106             UnaryOperator<InsertDSL<R>> completer) {
107         return completer.apply(SqlBuilder.insert(row).into(table))
108                 .build()
109                 .render(RenderingStrategies.MYBATIS3);
110     }
111 
112     public static <R> int insert(ToIntFunction<InsertStatementProvider<R>> mapper, R row,
113             SqlTable table, UnaryOperator<InsertDSL<R>> completer) {
114         return mapper.applyAsInt(insert(row, table, completer));
115     }
116 
117     public static GeneralInsertStatementProvider generalInsert(SqlTable table,
118             UnaryOperator<GeneralInsertDSL> completer) {
119         return completer.apply(GeneralInsertDSL.insertInto(table))
120                 .build()
121                 .render(RenderingStrategies.MYBATIS3);
122     }
123 
124     public static int generalInsert(ToIntFunction<GeneralInsertStatementProvider> mapper,
125             SqlTable table, UnaryOperator<GeneralInsertDSL> completer) {
126         return mapper.applyAsInt(generalInsert(table, completer));
127     }
128 
129     public static <R> MultiRowInsertStatementProvider<R> insertMultiple(Collection<R> records, SqlTable table,
130             UnaryOperator<MultiRowInsertDSL<R>> completer) {
131         return completer.apply(SqlBuilder.insertMultiple(records).into(table))
132                 .build()
133                 .render(RenderingStrategies.MYBATIS3);
134     }
135 
136     public static <R> int insertMultiple(ToIntFunction<MultiRowInsertStatementProvider<R>> mapper,
137             Collection<R> records, SqlTable table, UnaryOperator<MultiRowInsertDSL<R>> completer) {
138         return mapper.applyAsInt(insertMultiple(records, table, completer));
139     }
140 
141     public static <R> int insertMultipleWithGeneratedKeys(ToIntBiFunction<String, List<R>> mapper,
142             Collection<R> records, SqlTable table, UnaryOperator<MultiRowInsertDSL<R>> completer) {
143         MultiRowInsertStatementProvider<R> provider = insertMultiple(records, table, completer);
144         return mapper.applyAsInt(provider.getInsertStatement(), provider.getRecords());
145     }
146 
147     public static SelectStatementProvider select(BasicColumn[] selectList, SqlTable table,
148             SelectDSLCompleter completer) {
149         return select(SqlBuilder.select(selectList).from(table), completer);
150     }
151 
152     public static SelectStatementProvider select(QueryExpressionDSL<SelectModel> start,
153             SelectDSLCompleter completer) {
154         return completer.apply(start)
155                 .build()
156                 .render(RenderingStrategies.MYBATIS3);
157     }
158 
159     public static SelectStatementProvider selectDistinct(BasicColumn[] selectList, SqlTable table,
160             SelectDSLCompleter completer) {
161         return select(SqlBuilder.selectDistinct(selectList).from(table), completer);
162     }
163 
164     public static <R> List<R> selectDistinct(Function<SelectStatementProvider, List<R>> mapper,
165             BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
166         return mapper.apply(selectDistinct(selectList, table, completer));
167     }
168 
169     public static <R> List<R> selectList(Function<SelectStatementProvider, List<R>> mapper,
170             BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
171         return mapper.apply(select(selectList, table, completer));
172     }
173 
174     public static <R> List<R> selectList(Function<SelectStatementProvider, List<R>> mapper,
175             QueryExpressionDSL<SelectModel> start, SelectDSLCompleter completer) {
176         return mapper.apply(select(start, completer));
177     }
178 
179     public static <R> R selectOne(Function<SelectStatementProvider, R> mapper,
180             BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
181         return mapper.apply(select(selectList, table, completer));
182     }
183 
184     public static <R> R selectOne(Function<SelectStatementProvider, R> mapper,
185             QueryExpressionDSL<SelectModel> start, SelectDSLCompleter completer) {
186         return mapper.apply(select(start, completer));
187     }
188 
189     public static UpdateStatementProvider update(SqlTable table, UpdateDSLCompleter completer) {
190         return completer.apply(SqlBuilder.update(table))
191                 .build()
192                 .render(RenderingStrategies.MYBATIS3);
193     }
194 
195     public static int update(ToIntFunction<UpdateStatementProvider> mapper,
196             SqlTable table, UpdateDSLCompleter completer) {
197         return mapper.applyAsInt(update(table, completer));
198     }
199 }