extends Serializable {
*/
Children isNotNull(R column);
+ /**
+ * 字段 = 空字符串("")
+ * 例: isBlank("name")
+ *
+ * @param column 字段
+ * @return children
+ */
+ Children isBlank(R column);
+
+ /**
+ * 字段 != 空字符串("")
+ * 例: isNotBlank("name")
+ *
+ * @param column 字段
+ * @return children
+ */
+ Children isNotBlank(R column);
+
/**
* 字段 IN (value.get(0), value.get(1), ...)
* 例: in("id", Arrays.asList(1, 2, 3, 4, 5))
diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/GeneratedCriteria.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/GeneratedCriteria.java
index 71242599e336db81dd36c70f22a0c0237b79079b..006701867151ef33036ba1cefb8775348e80ebee 100644
--- a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/GeneratedCriteria.java
+++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/GeneratedCriteria.java
@@ -4,7 +4,10 @@
package cn.cliveyuan.robin.base.condition;
+import cn.cliveyuan.robin.base.util.RobinStrUtils;
import cn.cliveyuan.robin.base.util.SqlUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
@@ -19,7 +22,7 @@ import java.util.Objects;
*/
@SuppressWarnings({"serial", "unchecked"})
public abstract class GeneratedCriteria implements Compare, Func {
-
+ private static final Logger LOGGER = LoggerFactory.getLogger(GeneratedCriteria.class);
/**
* 占位符
*/
@@ -65,8 +68,17 @@ public abstract class GeneratedCriteria implements Compare Objects.equals(x.getCondition(), condition));
criteria.add(new Criterion(condition, value));
@@ -75,14 +87,19 @@ public abstract class GeneratedCriteria implements Compare implements Compare implements Compare coll) {
addCriterion(column, SqlKeyword.IN, coll);
diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/LambdaUtils.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/LambdaUtils.java
index d0fe97034768e1c2256effdc2731b8184d04f80f..4c30fc8e1a3c22f3eb714f69f946049353d1c16f 100644
--- a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/LambdaUtils.java
+++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/LambdaUtils.java
@@ -4,11 +4,14 @@
package cn.cliveyuan.robin.base.util;
+import cn.cliveyuan.robin.base.annotation.TableField;
import cn.cliveyuan.robin.base.support.SFunction;
import java.lang.invoke.SerializedLambda;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@@ -28,7 +31,28 @@ public class LambdaUtils {
public static String getFieldName(SFunction func) {
SerializedLambda serializedLambda = resolveSerializedLambdaCache(func);
String getter = serializedLambda.getImplMethodName();
- return resolveFieldName(getter);
+ return getColumnName(serializedLambda.getImplClass(), resolveFieldName(getter));
+ }
+
+ /**
+ * 通过对象字段名获取表字段
+ *
+ * @param implClassString 对象
+ * @param fieldName 字段名
+ * @return
+ */
+ private static String getColumnName(String implClassString, String fieldName) {
+ try {
+ Class> implClass = Class.forName(implClassString.replace('/', '.'));
+ Field field = implClass.getDeclaredField(fieldName);
+ TableField tableField = field.getAnnotation(TableField.class);
+ if (Objects.nonNull(tableField) && RobinStrUtils.isNotBlank(tableField.value())) {
+ return tableField.value();
+ }
+ } catch (ClassNotFoundException | NoSuchFieldException e) {
+ throw new RuntimeException(e);
+ }
+ return fieldName;
}
private static SerializedLambda resolveSerializedLambdaCache(SFunction func) {
diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/ReflectUtils.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/ReflectUtils.java
index d9ff4aa8fa98d8cbf8401c4de0c1a7ee15e56479..a5b3bb61c3e6f3815b90c1a508e2f83f78fb16cb 100644
--- a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/ReflectUtils.java
+++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/ReflectUtils.java
@@ -105,7 +105,7 @@ public class ReflectUtils {
// 读取字段
List fields = new ArrayList<>();
reflectEntity.setFields(fields);
- List declaredFields = getDeclaredFields(clazz);
+ List declaredFields = getAllDeclaredFields(clazz);
for (Field declaredField : declaredFields) {
String name = declaredField.getName();
boolean primaryKey = false;
@@ -156,24 +156,34 @@ public class ReflectUtils {
* @param 实体对象类
* @return
*/
- public static Map resolveEntityFieldAndValue(T entity) {
- Map fieldValueMap = new HashMap<>();
+ public static Map resolveEntityFieldAndValue(T entity) {
+ Map fieldValueMap = new HashMap<>();
Class> entityClass = entity.getClass();
- List declaredFields = getDeclaredFields(entityClass);
+ List declaredFields = getAllDeclaredFields(entityClass);
List fieldNames = declaredFields.stream()
.map(Field::getName)
.collect(Collectors.toList());
+ Map fieldMap = declaredFields.stream().collect(Collectors.toMap(Field::getName, Function.identity()));
- Method[] declaredMethods = entityClass.getDeclaredMethods();
- Map getMethodMap = Arrays.stream(declaredMethods).filter(x -> x.getName().startsWith(GET_METHOD_PREFIX))
+ List declaredMethods = getAllMethods(entityClass);
+ Map getMethodMap = declaredMethods.stream().filter(x -> x.getName().startsWith(GET_METHOD_PREFIX))
.collect(Collectors.toMap(Method::getName, Function.identity()));
fieldNames.forEach(fieldName -> {
+ String columnName = fieldName;
+ Field field = fieldMap.get(fieldName);
+ TableField tableField = field.getAnnotation(TableField.class);
+ if (Objects.nonNull(tableField) && RobinStrUtils.isNotBlank(tableField.value())) {
+ columnName = tableField.value();
+ }
String methodName = GET_METHOD_PREFIX.concat(SqlUtils.firstToUpperCase(fieldName));
Method method = getMethodMap.get(methodName);
+ if (Objects.isNull(method)) {
+ return;
+ }
Object value = methodInvoke(method, entity);
if (Objects.nonNull(value)) {
- fieldValueMap.put(fieldName, value.toString());
+ fieldValueMap.put(columnName, value);
}
});
return fieldValueMap;
@@ -190,25 +200,85 @@ public class ReflectUtils {
}
public static Method getMethod(Class> entityClass, String fieldName) {
- try {
- return entityClass.getDeclaredMethod(GET_METHOD_PREFIX.concat(SqlUtils.firstToUpperCase(fieldName)));
- } catch (NoSuchMethodException e) {
- LOGGER.error("getMethod error", e);
- throw new RuntimeException(e);
+ Method method = getMethodRecursion(entityClass, fieldName);
+ if (Objects.isNull(method)) {
+ String methodName = GET_METHOD_PREFIX.concat(SqlUtils.firstToUpperCase(fieldName));
+ throw new RuntimeException(String.format("NoSuchMethodException: %s.%s()", entityClass, methodName));
+ }
+ return method;
+ }
+
+ /**
+ * 递归获取对象get方法
+ *
+ * @param entityClass 对象类
+ * @param fieldName 字段名
+ * @return
+ */
+ private static Method getMethodRecursion(Class> entityClass, String fieldName) {
+ String methodName = GET_METHOD_PREFIX.concat(SqlUtils.firstToUpperCase(fieldName));
+ if ("java.lang.Object".equalsIgnoreCase(entityClass.getName())) {
+ return null;
+ }
+ return Arrays.stream(entityClass.getDeclaredMethods())
+ .filter(x -> Objects.equals(x.getName(), methodName))
+ .findFirst()
+ .orElseGet(() -> getMethodRecursion(entityClass.getSuperclass(), fieldName));
+ }
+
+ public static List getAllMethods(Class> entityClass) {
+ List list = new ArrayList<>();
+ getMethodsRecursion(entityClass, list);
+ return list;
+ }
+
+ public static void getMethodsRecursion(Class> entityClass, List list) {
+ if ("java.lang.Object".equalsIgnoreCase(entityClass.getName())) {
+ return;
}
+ list.addAll(Arrays.stream(entityClass.getDeclaredMethods()).collect(Collectors.toList()));
+ getMethodsRecursion(entityClass.getSuperclass(), list);
}
/**
- * 获取所有声明字段,且非static修饰
+ * 获取当前类声明字段,且非static修饰
*
* @param clazz 类对象
* @return
*/
- private static List getDeclaredFields(Class> clazz) {
+ public static List getDeclaredFields(Class> clazz) {
Field[] declaredFields = clazz.getDeclaredFields();
return Arrays.stream(declaredFields).filter(x -> !Modifier.isStatic(x.getModifiers()))
.collect(Collectors.toList());
+ }
+ /**
+ * 获取所有声明字段,且非static修饰 (包括父类)
+ *
+ * @param clazz 类对象
+ * @return
+ */
+ public static List getAllDeclaredFields(Class> clazz) {
+ List list = new ArrayList<>();
+ getFieldsRecursion(clazz, list);
+ return list;
+ }
+
+ /**
+ * 递归获取对象字段
+ *
+ * @param entityClass 对象类
+ * @param fields 字段列表
+ * @return
+ */
+ private static void getFieldsRecursion(Class> entityClass, List fields) {
+ if ("java.lang.Object".equalsIgnoreCase(entityClass.getName())) {
+ return;
+ }
+ Field[] declaredFields = entityClass.getDeclaredFields();
+ fields.addAll(Arrays.stream(declaredFields).filter(x -> !Modifier.isStatic(x.getModifiers()))
+ .collect(Collectors.toList()));
+ getFieldsRecursion(entityClass.getSuperclass(), fields);
}
}
diff --git a/robin-base/src/test/java/cn/cliveyuan/robin/base/test/ReflectUtilsTest.java b/robin-base/src/test/java/cn/cliveyuan/robin/base/test/ReflectUtilsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..75014b59529c43fcd922f0a4fdfab6e83e17c4d3
--- /dev/null
+++ b/robin-base/src/test/java/cn/cliveyuan/robin/base/test/ReflectUtilsTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2021, CliveYuan All rights reserved.
+ */
+
+package cn.cliveyuan.robin.base.test;
+
+import cn.cliveyuan.robin.base.util.ReflectUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author Clive Yuan
+ * @date 2021/06/07
+ */
+public class ReflectUtilsTest {
+
+ @Test
+ public void test() {
+ Method method = ReflectUtils.getMethod(SpottyDog.class, "name");
+ System.out.println(method);
+ Assert.assertNotNull(method);
+ }
+
+ @Test
+ public void test2() {
+ System.out.println(ReflectUtils.getDeclaredFields(Animal.class));
+ System.out.println(ReflectUtils.getAllDeclaredFields(Animal.class));
+ System.out.println(ReflectUtils.getDeclaredFields(Dog.class));
+ System.out.println(ReflectUtils.getAllDeclaredFields(Dog.class));
+ }
+
+ class Animal {
+ private Long id;
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ }
+
+ class Dog extends Animal {
+ private String type;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+ }
+
+ class SpottyDog extends Dog {
+
+ }
+}
diff --git a/robin-generator/pom.xml b/robin-generator/pom.xml
index 64a1ebc1c1cc487752c28b75fcbd0c1d2305044d..f6d81c5c4df51cdde985a8b432f87c3b7a938f6d 100644
--- a/robin-generator/pom.xml
+++ b/robin-generator/pom.xml
@@ -2,13 +2,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
robin-generator
- 1.2.0
+ 1.2.4
jar
com.gitee.opensource4clive
robin
- 1.2.0
+ 1.2.3
diff --git a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/CodeGeneratorXmlConfig.java b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/CodeGeneratorXmlConfig.java
index 2e49b8abbc08b5f317ea32aed57669a668073f2a..d1f7b16fad9fa4b9559b0ef904fa39004aae6e1d 100644
--- a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/CodeGeneratorXmlConfig.java
+++ b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/CodeGeneratorXmlConfig.java
@@ -88,10 +88,26 @@ public class CodeGeneratorXmlConfig implements Serializable {
@Data
@Builder
public static class Table {
+ /**
+ * 表名
+ */
private String tableName;
+ /**
+ * 对象名称
+ */
private String entityObjectName;
+ /**
+ * 忽略字段
+ */
private Set ignoreColumns;
+ /**
+ * 对象后缀
+ */
private String entityObjectSuffix;
+ /**
+ * 移除表前缀
+ */
+ private String removePrefix;
}
}
diff --git a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/GeneratorContextResolver.java b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/GeneratorContextResolver.java
index ba51c211e2d66caf4c1614353315e10575e9ada5..51304a40dfa0990ac0912c9508c64f132ce3b3dd 100644
--- a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/GeneratorContextResolver.java
+++ b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/core/GeneratorContextResolver.java
@@ -83,7 +83,11 @@ public class GeneratorContextResolver {
private Entity table2Entity(CodeGeneratorXmlConfig.Table table) {
TableInfo tableInfo = tableIntrospect.introspect(table.getTableName());
Entity entity = new Entity();
- String lowerCamelName = GeneratorUtils.getLowerCamelName(tableInfo.getName());
+ String tableName = tableInfo.getName();
+ if (StringUtils.isNotBlank(table.getRemovePrefix()) && tableName.startsWith(table.getRemovePrefix())) {
+ tableName = tableName.replaceFirst(table.getRemovePrefix(), "");
+ }
+ String lowerCamelName = GeneratorUtils.getLowerCamelName(tableName);
String upperCamelName = StringUtils.capitalize(lowerCamelName);
String entityName = table.getEntityObjectName();
String suffix = StringUtils.isNotBlank(table.getEntityObjectSuffix()) ? table.getEntityObjectSuffix() : "";
@@ -244,6 +248,7 @@ public class GeneratorContextResolver {
String createTimeColumn = this.getAttributeValue(tableEls, "createTimeColumn", true);
String updateTimeColumn = this.getAttributeValue(tableEls, "updateTimeColumn", true);
String entityObjectSuffix = this.getAttributeValue(tableEls, "entityObjectSuffix", true);
+ String removePrefix = this.getAttributeValue(tableEls, "removePrefix", true);
Set globalIgnoreColumnSet = this.getIgnoreColumnSet(tableEls);
String primaryKeyColumn = GeneratorConst.PRIMARY_KEY_COL;
@@ -273,6 +278,8 @@ public class GeneratorContextResolver {
tables.add(CodeGeneratorXmlConfig.Table.builder()
.tableName(tableName)
.ignoreColumns(globalIgnoreColumnSet)
+ .removePrefix(removePrefix)
+ .entityObjectSuffix(entityObjectSuffix)
.build());
});
} else {
@@ -286,6 +293,7 @@ public class GeneratorContextResolver {
.entityObjectName(this.getAttributeValue(tableEl, "entityObjectName", true))
.entityObjectSuffix(entityObjectSuffix)
.ignoreColumns(tableIgnoreColumnSet)
+ .removePrefix(removePrefix)
.build());
}
}
diff --git a/robin-generator/src/main/resources/templates/controller.java.ftl b/robin-generator/src/main/resources/templates/controller.java.ftl
index 4f61efe2915da7d8de83a7460f2370a5863cae2b..3c867a1df69bd183220db2ae61be8aa71a336df5 100644
--- a/robin-generator/src/main/resources/templates/controller.java.ftl
+++ b/robin-generator/src/main/resources/templates/controller.java.ftl
@@ -6,7 +6,7 @@ import ${servicePackage}.${entity.upperCamelName}${serviceSuffix};
import cn.cliveyuan.robin.base.condition.PageQueryExample;
import cn.cliveyuan.robin.base.common.PageQueryRequest;
import cn.cliveyuan.robin.base.util.BeanCopyUtils;
-import cn.cliveyuan.robin.base.common.ApiResponse;
+import cn.cliveyuan.robin.base.common.WebApiResponse;
import cn.cliveyuan.robin.base.common.Pagination;
[#if baseConfig.enableSwagger]
@@ -40,31 +40,31 @@ public class ${entity.fileName} {
[#if baseConfig.enableSwagger]
@ApiOperation("保存")
[/#if]
- public ApiResponse save([#if baseConfig.enableValidation]@Validated[/#if] ${entity.upperCamelName}${dtoSuffix} request) {
- return ApiResponse.success(${entity.lowerCamelName}${serviceSuffix}.save(BeanCopyUtils.copy(request, ${entity.entityName}.class)) > 0);
+ public WebApiResponse save([#if baseConfig.enableValidation]@Validated[/#if] ${entity.upperCamelName}${dtoSuffix} request) {
+ return WebApiResponse.success(${entity.lowerCamelName}${serviceSuffix}.save(BeanCopyUtils.copy(request, ${entity.entityName}.class)) > 0);
}
@PostMapping("delete")
[#if baseConfig.enableSwagger]
@ApiOperation("删除")
[/#if]
- public ApiResponse delete(Long id) {
- return ApiResponse.success(${entity.lowerCamelName}${serviceSuffix}.delete(id) > 0);
+ public WebApiResponse delete(Long id) {
+ return WebApiResponse.success(${entity.lowerCamelName}${serviceSuffix}.delete(id) > 0);
}
@PostMapping("get")
[#if baseConfig.enableSwagger]
@ApiOperation("获取")
[/#if]
- public ApiResponse<${entity.upperCamelName}${dtoSuffix}> get(Long id) {
- return ApiResponse.success(BeanCopyUtils.copy(${entity.lowerCamelName}${serviceSuffix}.get(id), ${entity.upperCamelName}${dtoSuffix}.class));
+ public WebApiResponse<${entity.upperCamelName}${dtoSuffix}> get(Long id) {
+ return WebApiResponse.success(BeanCopyUtils.copy(${entity.lowerCamelName}${serviceSuffix}.get(id), ${entity.upperCamelName}${dtoSuffix}.class));
}
@PostMapping("page")
[#if baseConfig.enableSwagger]
@ApiOperation("分页查询")
[/#if]
- public ApiResponse> page(@RequestBody PageQueryRequest<${entity.upperCamelName}${dtoSuffix}> request) {
- return ApiResponse.success(BeanCopyUtils.copyPagination(${entity.lowerCamelName}${serviceSuffix}.page(new PageQueryExample<>(request, ${entity.entityName}.class)), ${entity.upperCamelName}${dtoSuffix}.class));
+ public WebApiResponse> page(@RequestBody PageQueryRequest<${entity.upperCamelName}${dtoSuffix}> request) {
+ return WebApiResponse.success(BeanCopyUtils.copyPagination(${entity.lowerCamelName}${serviceSuffix}.page(new PageQueryExample<>(request, ${entity.entityName}.class)), ${entity.upperCamelName}${dtoSuffix}.class));
}
}
diff --git a/robin-generator/src/test/resources/code-generator.xml b/robin-generator/src/test/resources/code-generator.xml
index 2b3bcfc2e10458b6d6972232361f8364888201e4..e78c180aa6a48de46dc46b3bf99aa6e63f0d638b 100755
--- a/robin-generator/src/test/resources/code-generator.xml
+++ b/robin-generator/src/test/resources/code-generator.xml
@@ -43,10 +43,10 @@
-
+
-
-
+
diff --git a/update_versions.sh b/update_versions.sh
index 9af421c73504fd5379580c38983ae306f675df3a..42769bf8f173b04e0e792b129b82bb144130851a 100755
--- a/update_versions.sh
+++ b/update_versions.sh
@@ -1,3 +1,3 @@
#!/bin/sh
-mvn versions:set -DnewVersion=1.2.0
+mvn versions:set -DnewVersion=1.2.4