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.AddressDynamicSqlSupport.address;
19  import static examples.simple.PersonDynamicSqlSupport.birthDate;
20  import static examples.simple.PersonDynamicSqlSupport.employed;
21  import static examples.simple.PersonDynamicSqlSupport.firstName;
22  import static examples.simple.PersonDynamicSqlSupport.id;
23  import static examples.simple.PersonDynamicSqlSupport.lastName;
24  import static examples.simple.PersonDynamicSqlSupport.occupation;
25  import static examples.simple.PersonDynamicSqlSupport.person;
26  import static org.mybatis.dynamic.sql.SqlBuilder.*;
27  
28  import java.util.List;
29  import java.util.Optional;
30  
31  import org.apache.ibatis.annotations.Mapper;
32  import org.apache.ibatis.annotations.Result;
33  import org.apache.ibatis.annotations.ResultMap;
34  import org.apache.ibatis.annotations.Results;
35  import org.apache.ibatis.annotations.SelectProvider;
36  import org.apache.ibatis.type.EnumOrdinalTypeHandler;
37  import org.apache.ibatis.type.JdbcType;
38  import org.mybatis.dynamic.sql.BasicColumn;
39  import org.mybatis.dynamic.sql.SqlBuilder;
40  import org.mybatis.dynamic.sql.select.CountDSL;
41  import org.mybatis.dynamic.sql.select.CountDSLCompleter;
42  import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
43  import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
44  import org.mybatis.dynamic.sql.select.SelectModel;
45  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
46  import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
47  import org.mybatis.dynamic.sql.util.mybatis3.CommonCountMapper;
48  import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
49  
50  /**
51   * This is a mapper that shows coding a join
52   */
53  @Mapper
54  public interface PersonWithAddressMapper extends CommonCountMapper {
55  
56      @SelectProvider(type=SqlProviderAdapter.class, method="select")
57      @Results(id="PersonWithAddressResult", value= {
58              @Result(column="A_ID", property="id", jdbcType=JdbcType.INTEGER, id=true),
59              @Result(column="first_name", property="firstName", jdbcType=JdbcType.VARCHAR),
60              @Result(column="last_name", property="lastName", jdbcType=JdbcType.VARCHAR, typeHandler=LastNameTypeHandler.class),
61              @Result(column="birth_date", property="birthDate", jdbcType=JdbcType.DATE),
62              @Result(column="employed", property="employed", jdbcType=JdbcType.VARCHAR, typeHandler=YesNoTypeHandler.class),
63              @Result(column="occupation", property="occupation", jdbcType=JdbcType.VARCHAR),
64              @Result(column="address_id", property="address.id", jdbcType=JdbcType.INTEGER),
65              @Result(column="street_address", property="address.streetAddress", jdbcType=JdbcType.VARCHAR),
66              @Result(column="city", property="address.city", jdbcType=JdbcType.VARCHAR),
67              @Result(column="state", property="address.state", jdbcType=JdbcType.CHAR),
68              @Result(column="address_type", property="address.addressType", jdbcType=JdbcType.INTEGER,
69                      typeHandler = EnumOrdinalTypeHandler.class)
70      })
71      List<PersonWithAddress> selectMany(SelectStatementProvider selectStatement);
72  
73      @SelectProvider(type=SqlProviderAdapter.class, method="select")
74      @ResultMap("PersonWithAddressResult")
75      Optional<PersonWithAddress> selectOne(SelectStatementProvider selectStatement);
76  
77      BasicColumn[] selectList =
78              BasicColumn.columnList(id.as("A_ID"), firstName, lastName, birthDate, employed, occupation, address.id,
79                      address.streetAddress, address.city, address.state, address.addressType);
80  
81      default Optional<PersonWithAddress> selectOne(SelectDSLCompleter completer) {
82          QueryExpressionDSL<SelectModel> start = SqlBuilder.select(selectList).from(person)
83                  .join(address, on(person.addressId, isEqualTo(address.id)));
84          return MyBatis3Utils.selectOne(this::selectOne, start, completer);
85      }
86  
87      default List<PersonWithAddress> select(SelectDSLCompleter completer) {
88          QueryExpressionDSL<SelectModel> start = SqlBuilder.select(selectList).from(person)
89                  .join(address, on(person.addressId, isEqualTo(address.id)));
90          return MyBatis3Utils.selectList(this::selectMany, start, completer);
91      }
92  
93      default Optional<PersonWithAddress> selectByPrimaryKey(Integer recordId) {
94          return selectOne(c ->
95              c.where(id, isEqualTo(recordId))
96          );
97      }
98  
99      default long count(CountDSLCompleter completer) {
100         CountDSL<SelectModel> start = countFrom(person)
101                 .join(address, on(person.addressId, isEqualTo(address.id)));
102         return MyBatis3Utils.countFrom(this::count, start, completer);
103     }
104 }