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.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
52
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 }