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.simple;
17  
18  import static examples.simple.PersonDynamicSqlSupport.*;
19  import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
20  import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent;
21  
22  import java.util.Arrays;
23  import java.util.Collection;
24  import java.util.Date;
25  import java.util.List;
26  import java.util.Optional;
27  import java.util.function.UnaryOperator;
28  
29  import org.apache.ibatis.annotations.Arg;
30  import org.apache.ibatis.annotations.Mapper;
31  import org.apache.ibatis.annotations.SelectProvider;
32  import org.apache.ibatis.type.JdbcType;
33  import org.mybatis.dynamic.sql.BasicColumn;
34  import org.mybatis.dynamic.sql.delete.DeleteDSLCompleter;
35  import org.mybatis.dynamic.sql.insert.GeneralInsertDSL;
36  import org.mybatis.dynamic.sql.select.CountDSLCompleter;
37  import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
38  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
39  import org.mybatis.dynamic.sql.update.UpdateDSL;
40  import org.mybatis.dynamic.sql.update.UpdateDSLCompleter;
41  import org.mybatis.dynamic.sql.update.UpdateModel;
42  import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
43  import org.mybatis.dynamic.sql.util.mybatis3.CommonCountMapper;
44  import org.mybatis.dynamic.sql.util.mybatis3.CommonDeleteMapper;
45  import org.mybatis.dynamic.sql.util.mybatis3.CommonInsertMapper;
46  import org.mybatis.dynamic.sql.util.mybatis3.CommonUpdateMapper;
47  import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
48  
49  /**
50   *
51   * Note: this is the canonical mapper with the new style methods
52   * and represents the desired output for MyBatis Generator
53   *
54   */
55  @Mapper
56  public interface PersonMapper extends CommonCountMapper, CommonDeleteMapper, CommonInsertMapper<PersonRecord>, CommonUpdateMapper {
57  
58      @SelectProvider(type=SqlProviderAdapter.class, method="select")
59      @Arg(column="A_ID", jdbcType=JdbcType.INTEGER, id=true, javaType = Integer.class)
60      @Arg(column="first_name", jdbcType=JdbcType.VARCHAR, javaType = String.class)
61      @Arg(column="last_name", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class, javaType = LastName.class)
62      @Arg(column="birth_date", jdbcType=JdbcType.DATE, javaType = Date.class)
63      @Arg(column="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class, javaType = Boolean.class)
64      @Arg(column="occupation", jdbcType=JdbcType.VARCHAR, javaType = String.class)
65      @Arg(column="address_id", jdbcType=JdbcType.INTEGER, javaType = Integer.class)
66      List<PersonRecord> selectMany(SelectStatementProvider selectStatement);
67  
68      @SelectProvider(type=SqlProviderAdapter.class, method="select")
69      @Arg(column="A_ID", jdbcType=JdbcType.INTEGER, id=true, javaType = Integer.class)
70      @Arg(column="first_name", jdbcType=JdbcType.VARCHAR, javaType = String.class)
71      @Arg(column="last_name", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class, javaType = LastName.class)
72      @Arg(column="birth_date", jdbcType=JdbcType.DATE, javaType = Date.class)
73      @Arg(column="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class, javaType = Boolean.class)
74      @Arg(column="occupation", jdbcType=JdbcType.VARCHAR, javaType = String.class)
75      @Arg(column="address_id", jdbcType=JdbcType.INTEGER, javaType = Integer.class)
76      Optional<PersonRecord> selectOne(SelectStatementProvider selectStatement);
77  
78      BasicColumn[] selectList =
79              BasicColumn.columnList(id.as("A_ID"), firstName, lastName, birthDate, employed, occupation, addressId);
80  
81      default long count(CountDSLCompleter completer) {
82          return MyBatis3Utils.countFrom(this::count, person, completer);
83      }
84  
85      default long count(BasicColumn column, CountDSLCompleter completer) {
86          return MyBatis3Utils.count(this::count, column, person, completer);
87      }
88  
89      default long countDistinct(BasicColumn column, CountDSLCompleter completer) {
90          return MyBatis3Utils.countDistinct(this::count, column, person, completer);
91      }
92  
93      default int delete(DeleteDSLCompleter completer) {
94          return MyBatis3Utils.deleteFrom(this::delete, person, completer);
95      }
96  
97      default int deleteByPrimaryKey(Integer recordId) {
98          return delete(c ->
99              c.where(id, isEqualTo(recordId))
100         );
101     }
102 
103     default int generalInsert(UnaryOperator<GeneralInsertDSL> completer) {
104         return MyBatis3Utils.generalInsert(this::generalInsert, person, completer);
105     }
106 
107     default int insert(PersonRecord row) {
108         return MyBatis3Utils.insert(this::insert, row, person, c ->
109             c.map(id).toProperty("id")
110             .map(firstName).toProperty("firstName")
111             .map(lastName).toProperty("lastName")
112             .map(birthDate).toProperty("birthDate")
113             .map(employed).toProperty("employed")
114             .map(occupation).toProperty("occupation")
115             .map(addressId).toProperty("addressId")
116         );
117     }
118 
119     default int insertMultiple(PersonRecord...records) {
120         return insertMultiple(Arrays.asList(records));
121     }
122 
123     default int insertMultiple(Collection<PersonRecord> records) {
124         return MyBatis3Utils.insertMultiple(this::insertMultiple, records, person, c ->
125             c.map(id).toProperty("id")
126             .map(firstName).toProperty("firstName")
127             .map(lastName).toProperty("lastName")
128             .map(birthDate).toProperty("birthDate")
129             .map(employed).toProperty("employed")
130             .map(occupation).toProperty("occupation")
131             .map(addressId).toProperty("addressId")
132         );
133     }
134 
135     default int insertSelective(PersonRecord row) {
136         return MyBatis3Utils.insert(this::insert, row, person, c ->
137             c.map(id).toPropertyWhenPresent("id", row::id)
138             .map(firstName).toPropertyWhenPresent("firstName", row::firstName)
139             .map(lastName).toPropertyWhenPresent("lastName", row::lastName)
140             .map(birthDate).toPropertyWhenPresent("birthDate", row::birthDate)
141             .map(employed).toPropertyWhenPresent("employed", row::employed)
142             .map(occupation).toPropertyWhenPresent("occupation", row::occupation)
143             .map(addressId).toPropertyWhenPresent("addressId", row::addressId)
144         );
145     }
146 
147     default Optional<PersonRecord> selectOne(SelectDSLCompleter completer) {
148         return MyBatis3Utils.selectOne(this::selectOne, selectList, person, completer);
149     }
150 
151     default List<PersonRecord> select(SelectDSLCompleter completer) {
152         return MyBatis3Utils.selectList(this::selectMany, selectList, person, completer);
153     }
154 
155     default List<PersonRecord> selectDistinct(SelectDSLCompleter completer) {
156         return MyBatis3Utils.selectDistinct(this::selectMany, selectList, person, completer);
157     }
158 
159     default Optional<PersonRecord> selectByPrimaryKey(Integer recordId) {
160         return selectOne(c ->
161             c.where(id, isEqualTo(recordId))
162         );
163     }
164 
165     default int update(UpdateDSLCompleter completer) {
166         return MyBatis3Utils.update(this::update, person, completer);
167     }
168 
169     static UpdateDSL<UpdateModel> updateAllColumns(PersonRecord row,
170             UpdateDSL<UpdateModel> dsl) {
171         return dsl.set(id).equalToOrNull(row::id)
172                 .set(firstName).equalToOrNull(row::firstName)
173                 .set(lastName).equalToOrNull(row::lastName)
174                 .set(birthDate).equalToOrNull(row::birthDate)
175                 .set(employed).equalToOrNull(row::employed)
176                 .set(occupation).equalToOrNull(row::occupation)
177                 .set(addressId).equalToOrNull(row::addressId);
178     }
179 
180     static UpdateDSL<UpdateModel> updateSelectiveColumns(PersonRecord row,
181             UpdateDSL<UpdateModel> dsl) {
182         return dsl.set(id).equalToWhenPresent(row::id)
183                 .set(firstName).equalToWhenPresent(row::firstName)
184                 .set(lastName).equalToWhenPresent(row::lastName)
185                 .set(birthDate).equalToWhenPresent(row::birthDate)
186                 .set(employed).equalToWhenPresent(row::employed)
187                 .set(occupation).equalToWhenPresent(row::occupation)
188                 .set(addressId).equalToWhenPresent(row::addressId);
189     }
190 
191     default int updateByPrimaryKey(PersonRecord row) {
192         return update(c ->
193             c.set(firstName).equalToOrNull(row::firstName)
194             .set(lastName).equalToOrNull(row::lastName)
195             .set(birthDate).equalToOrNull(row::birthDate)
196             .set(employed).equalToOrNull(row::employed)
197             .set(occupation).equalToOrNull(row::occupation)
198             .set(addressId).equalToOrNull(row::addressId)
199             .where(id, isEqualToWhenPresent(row::id))
200         );
201     }
202 
203     default int updateByPrimaryKeySelective(PersonRecord row) {
204         return update(c ->
205             c.set(firstName).equalToWhenPresent(row::firstName)
206             .set(lastName).equalToWhenPresent(row::lastName)
207             .set(birthDate).equalToWhenPresent(row::birthDate)
208             .set(employed).equalToWhenPresent(row::employed)
209             .set(occupation).equalToWhenPresent(row::occupation)
210             .set(addressId).equalToWhenPresent(row::addressId)
211             .where(id, isEqualToWhenPresent(row::id))
212         );
213     }
214 }