1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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 }