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 examples.generated.always.mybatis;
17  
18  import static examples.generated.always.mybatis.GeneratedAlwaysDynamicSqlSupport.*;
19  import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
20  
21  import java.util.Arrays;
22  import java.util.Collection;
23  import java.util.List;
24  import java.util.Optional;
25  
26  import org.apache.ibatis.annotations.InsertProvider;
27  import org.apache.ibatis.annotations.Options;
28  import org.apache.ibatis.annotations.Param;
29  import org.apache.ibatis.annotations.Result;
30  import org.apache.ibatis.annotations.ResultMap;
31  import org.apache.ibatis.annotations.Results;
32  import org.apache.ibatis.annotations.SelectProvider;
33  import org.mybatis.dynamic.sql.BasicColumn;
34  import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
35  import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
36  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
37  import org.mybatis.dynamic.sql.update.UpdateDSL;
38  import org.mybatis.dynamic.sql.update.UpdateDSLCompleter;
39  import org.mybatis.dynamic.sql.update.UpdateModel;
40  import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
41  import org.mybatis.dynamic.sql.util.mybatis3.CommonUpdateMapper;
42  import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
43  
44  import examples.generated.always.GeneratedAlwaysRecord;
45  
46  public interface GeneratedAlwaysMapper extends CommonUpdateMapper {
47      @SelectProvider(type=SqlProviderAdapter.class, method="select")
48      @Results(id="gaResults", value={
49          @Result(property="id", column="id", id=true),
50          @Result(property="firstName", column="first_name"),
51          @Result(property="lastName", column="last_name"),
52          @Result(property="fullName", column="full_name")
53      })
54      List<GeneratedAlwaysRecord> selectMany(SelectStatementProvider selectStatement);
55  
56      @SelectProvider(type=SqlProviderAdapter.class, method="select")
57      @ResultMap("gaResults")
58      Optional<GeneratedAlwaysRecord> selectOne(SelectStatementProvider selectStatement);
59  
60      @InsertProvider(type=SqlProviderAdapter.class, method="insert")
61      @Options(useGeneratedKeys=true, keyProperty="row.fullName")
62      int insert(InsertStatementProvider<GeneratedAlwaysRecord> insertStatement);
63  
64      @InsertProvider(type=SqlProviderAdapter.class, method="insertMultipleWithGeneratedKeys")
65      @Options(useGeneratedKeys=true, keyProperty="records.fullName")
66      int insertMultiple(@Param("insertStatement") String statement, @Param("records") List<GeneratedAlwaysRecord> records);
67  
68      BasicColumn[] selectList =
69              BasicColumn.columnList(id, firstName, lastName, fullName);
70  
71      default Optional<GeneratedAlwaysRecord> selectOne(SelectDSLCompleter completer) {
72          return MyBatis3Utils.selectOne(this::selectOne, selectList, generatedAlways, completer);
73      }
74  
75      default List<GeneratedAlwaysRecord> select(SelectDSLCompleter completer) {
76          return MyBatis3Utils.selectList(this::selectMany, selectList, generatedAlways, completer);
77      }
78  
79      default Optional<GeneratedAlwaysRecord> selectByPrimaryKey(Integer recordId) {
80          return selectOne(c -> c.where(id, isEqualTo(recordId)));
81      }
82  
83      default int insert(GeneratedAlwaysRecord row) {
84          return MyBatis3Utils.insert(this::insert, row, generatedAlways, c ->
85              c.map(id).toProperty("id")
86                      .map(firstName).toProperty("firstName")
87                      .map(lastName).toProperty("lastName")
88          );
89      }
90  
91      default int insertMultiple(GeneratedAlwaysRecord...records) {
92          return insertMultiple(Arrays.asList(records));
93      }
94  
95      default int insertMultiple(Collection<GeneratedAlwaysRecord> records) {
96          return MyBatis3Utils.insertMultipleWithGeneratedKeys(this::insertMultiple, records, generatedAlways, c ->
97                  c.map(id).toProperty("id")
98                          .map(firstName).toProperty("firstName")
99                          .map(lastName).toProperty("lastName")
100         );
101     }
102 
103     default int insertSelective(GeneratedAlwaysRecord row) {
104         return MyBatis3Utils.insert(this::insert, row, generatedAlways, c ->
105                 c.map(id).toPropertyWhenPresent("id", row::getId)
106                         .map(firstName).toPropertyWhenPresent("firstName", row::getFirstName)
107                         .map(lastName).toPropertyWhenPresent("lastName", row::getLastName)
108         );
109     }
110 
111     default int update(UpdateDSLCompleter completer) {
112         return MyBatis3Utils.update(this::update, generatedAlways, completer);
113     }
114 
115     default int updateByPrimaryKey(GeneratedAlwaysRecord row) {
116         return update(c ->
117                 c.set(firstName).equalTo(row::getFirstName)
118                 .set(lastName).equalTo(row::getLastName)
119                 .where(id, isEqualTo(row::getId))
120         );
121     }
122 
123     default int updateByPrimaryKeySelective(GeneratedAlwaysRecord row) {
124         return update(c ->
125                 c.set(firstName).equalToWhenPresent(row::getFirstName)
126                         .set(lastName).equalToWhenPresent(row::getLastName)
127                         .where(id, isEqualTo(row::getId))
128         );
129     }
130 
131     static UpdateDSL<UpdateModel> updateSelectiveColumns(GeneratedAlwaysRecord row, UpdateDSL<UpdateModel> dsl) {
132         return dsl.set(id).equalToWhenPresent(row::getId)
133                 .set(firstName).equalToWhenPresent(row::getFirstName)
134                 .set(lastName).equalToWhenPresent(row::getLastName);
135     }
136 }