001package cn.mybatis.mp.generator.util;
002
003import cn.mybatis.mp.core.mybatis.mapper.context.Pager;
004import cn.mybatis.mp.core.sql.executor.chain.DeleteChain;
005import cn.mybatis.mp.core.sql.executor.chain.InsertChain;
006import cn.mybatis.mp.core.sql.executor.chain.QueryChain;
007import cn.mybatis.mp.core.sql.executor.chain.UpdateChain;
008import cn.mybatis.mp.core.util.NamingUtil;
009import cn.mybatis.mp.db.IdAutoType;
010import cn.mybatis.mp.db.annotations.*;
011import cn.mybatis.mp.generator.config.EntityConfig;
012import cn.mybatis.mp.generator.config.GeneratorConfig;
013import cn.mybatis.mp.generator.database.meta.ColumnInfo;
014import cn.mybatis.mp.generator.database.meta.EntityInfo;
015import lombok.Data;
016import org.apache.ibatis.annotations.Mapper;
017import org.springframework.beans.factory.annotation.Autowired;
018import org.springframework.stereotype.Repository;
019import org.springframework.stereotype.Service;
020import org.springframework.web.bind.annotation.*;
021
022import java.util.ArrayList;
023import java.util.Comparator;
024import java.util.List;
025import java.util.stream.Collectors;
026
027public class GeneratorUtil {
028
029    /**
030     * 获取实体类名字
031     *
032     * @param generatorConfig
033     * @param tableName
034     * @return
035     */
036    public static String getEntityName(GeneratorConfig generatorConfig, String tableName) {
037        EntityConfig entityConfig = generatorConfig.getEntityConfig();
038        if (entityConfig.getNameConvert() == null) {
039            entityConfig.nameConvert((table -> {
040                return NamingUtil.firstToUpperCase(NamingUtil.underlineToCamel(table));
041            }));
042        }
043        return entityConfig.getNameConvert().apply(tableName);
044    }
045
046
047    /**
048     * 获取实体类字段名字
049     *
050     * @param generatorConfig
051     * @param columnInfo
052     * @return
053     */
054    public static String getEntityFieldName(GeneratorConfig generatorConfig, ColumnInfo columnInfo) {
055        EntityConfig entityConfig = generatorConfig.getEntityConfig();
056        if (entityConfig.getFieldNameConverter() == null) {
057            return entityConfig.getFieldNamingStrategy().getName(columnInfo.getName(), false);
058        }
059        return entityConfig.getFieldNameConverter().apply(columnInfo);
060    }
061
062    /**
063     * 获取实体类字段备注
064     *
065     * @param generatorConfig
066     * @param columnInfo
067     * @return
068     */
069    public static String getEntityFieldRemarks(GeneratorConfig generatorConfig, ColumnInfo columnInfo) {
070        EntityConfig entityConfig = generatorConfig.getEntityConfig();
071        if (entityConfig.getRemarksConverter() == null) {
072            return columnInfo.getRemarks();
073        }
074        return entityConfig.getRemarksConverter().apply(columnInfo);
075    }
076
077    /**
078     * 获取列的java 类型
079     *
080     * @param generatorConfig
081     * @param columnInfo
082     * @return
083     */
084    public static Class<?> getColumnType(GeneratorConfig generatorConfig, ColumnInfo columnInfo) {
085        Class<?> type = generatorConfig.getEntityConfig().getTypeMapping().get(columnInfo.getJdbcType());
086        if (type == null) {
087            return Object.class;
088        }
089        return type;
090    }
091
092    /**
093     * 构建实体类的imports
094     *
095     * @param generatorConfig
096     * @param entityInfo
097     * @return
098     */
099    public static List<String> buildEntityImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
100        List<String> classList = new ArrayList<>();
101        classList.add(Table.class.getName());
102        if (entityInfo.getIdFieldInfo() != null) {
103            classList.add(TableId.class.getName());
104            if (entityInfo.getIdFieldInfo() != null) {
105                classList.add(IdAutoType.class.getName());
106            }
107        }
108
109        if (generatorConfig.getEntityConfig().getSuperClass() != null) {
110            classList.add(generatorConfig.getEntityConfig().getSuperClass());
111        }
112        if (generatorConfig.getEntityConfig().isLombok()) {
113            classList.add(Data.class.getName());
114        }
115        entityInfo.getFieldInfoList().forEach(item -> {
116            classList.add(item.getType().getName());
117            if (item.isNeedTableFiled()) {
118                classList.add(TableField.class.getName());
119            }
120            if (item.getColumnInfo().isVersion()) {
121                classList.add(Version.class.getName());
122            } else if (item.getColumnInfo().isTenantId()) {
123                classList.add(TenantId.class.getName());
124            }
125        });
126        return buildImports(classList);
127    }
128
129    /**
130     * 构建实体类的imports
131     *
132     * @param generatorConfig
133     * @param entityInfo
134     * @return
135     */
136    public static List<String> buildMapperImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
137        List<String> classList = new ArrayList<>();
138        if (generatorConfig.getMapperConfig().getSuperClass() != null) {
139            classList.add(generatorConfig.getMapperConfig().getSuperClass());
140        }
141        if (generatorConfig.getMapperConfig().isMapperAnnotation()) {
142            classList.add(Mapper.class.getName());
143        }
144        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
145        return buildImports(classList);
146    }
147
148    /**
149     * 构建Dao接口的imports
150     *
151     * @param generatorConfig
152     * @param entityInfo
153     * @return
154     */
155    public static List<String> buildDaoImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
156        List<String> classList = new ArrayList<>();
157        if (generatorConfig.getDaoConfig().getSuperClass() != null) {
158            classList.add(generatorConfig.getDaoConfig().getSuperClass());
159        }
160
161        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
162        if (entityInfo.getIdFieldInfo() != null) {
163            classList.add(entityInfo.getIdFieldInfo().getType().getName());
164        }
165        return buildImports(classList);
166    }
167
168    /**
169     * 构建Dao实现类的imports
170     *
171     * @param generatorConfig
172     * @param entityInfo
173     * @return
174     */
175    public static List<String> buildDaoImplImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
176        List<String> classList = new ArrayList<>();
177        if (generatorConfig.getDaoImplConfig().getSuperClass() != null) {
178            classList.add(generatorConfig.getDaoImplConfig().getSuperClass());
179        }
180
181        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
182        if (entityInfo.getIdFieldInfo() != null) {
183            classList.add(entityInfo.getIdFieldInfo().getType().getName());
184        }
185        classList.add(entityInfo.getMapperPackage() + "." + entityInfo.getMapperName());
186        classList.add(entityInfo.getDaoPackage() + "." + entityInfo.getDaoName());
187        classList.add(Repository.class.getName());
188        classList.add(Autowired.class.getName());
189        return buildImports(classList);
190    }
191
192
193    /**
194     * 构建Dao接口的imports
195     *
196     * @param generatorConfig
197     * @param entityInfo
198     * @return
199     */
200    public static List<String> buildServiceImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
201        List<String> classList = new ArrayList<>();
202        if (generatorConfig.getServiceConfig().getSuperClass() != null) {
203            classList.add(generatorConfig.getServiceConfig().getSuperClass());
204        }
205
206        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
207        if (entityInfo.getIdFieldInfo() != null) {
208            classList.add(entityInfo.getIdFieldInfo().getType().getName());
209        }
210        return buildImports(classList);
211    }
212
213    /**
214     * 构建Dao实现类的imports
215     *
216     * @param generatorConfig
217     * @param entityInfo
218     * @return
219     */
220    public static List<String> buildServiceImplImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
221        List<String> classList = new ArrayList<>();
222        if (generatorConfig.getServiceImplConfig().getSuperClass() != null) {
223            classList.add(generatorConfig.getServiceImplConfig().getSuperClass());
224        }
225
226        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
227        if (entityInfo.getIdFieldInfo() != null) {
228            classList.add(entityInfo.getIdFieldInfo().getType().getName());
229        }
230        classList.add(entityInfo.getDaoPackage() + "." + entityInfo.getDaoName());
231        classList.add(entityInfo.getServicePackage() + "." + entityInfo.getServiceName());
232        classList.add(Service.class.getName());
233        classList.add(Autowired.class.getName());
234
235        if (generatorConfig.getServiceImplConfig().isInjectMapper()) {
236            classList.add(entityInfo.getMapperPackage() + "." + entityInfo.getMapperName());
237            classList.add(QueryChain.class.getName());
238            classList.add(UpdateChain.class.getName());
239            classList.add(InsertChain.class.getName());
240            classList.add(DeleteChain.class.getName());
241        }
242        return buildImports(classList);
243    }
244
245    /**
246     * 构建Action的imports
247     *
248     * @param generatorConfig
249     * @param entityInfo
250     * @return
251     */
252    public static List<String> buildActionImports(GeneratorConfig generatorConfig, EntityInfo entityInfo) {
253        List<String> classList = new ArrayList<>();
254        if (generatorConfig.getActionConfig().getSuperClass() != null) {
255            classList.add(generatorConfig.getActionConfig().getSuperClass());
256        }
257
258        classList.add(entityInfo.getEntityPackage() + "." + entityInfo.getName());
259
260        if (entityInfo.getIdFieldInfo() != null) {
261            classList.add(entityInfo.getIdFieldInfo().getType().getName());
262        }
263        classList.add(entityInfo.getServicePackage() + "." + entityInfo.getServiceName());
264        classList.add(RestController.class.getName());
265        classList.add(RequestMapping.class.getName());
266        classList.add(Autowired.class.getName());
267
268        if (generatorConfig.getActionConfig().isSave() || generatorConfig.getActionConfig().isUpdate()) {
269            classList.add(PostMapping.class.getName());
270        }
271
272        if (generatorConfig.getActionConfig().isGetById() || generatorConfig.getActionConfig().isFind()) {
273            classList.add(GetMapping.class.getName());
274            if (generatorConfig.getActionConfig().isFind()) {
275                classList.add(Pager.class.getName());
276            }
277        }
278
279        if (generatorConfig.getActionConfig().isDeleteById()) {
280            classList.add(DeleteMapping.class.getName());
281        }
282        return buildImports(classList);
283    }
284
285    public static List<String> buildImports(List<String> classList) {
286        return classList.stream().filter(item -> !item.startsWith("java.lang")).distinct().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
287    }
288}