From ffd16637cfe67e2ba9a5c9cb52aeed70420a1537 Mon Sep 17 00:00:00 2001 From: CliveYuan Date: Sat, 15 Jan 2022 13:23:17 +0800 Subject: [PATCH 1/2] fix #I4Q1YQ and #I4QXIL --- .../cn/cliveyuan/robin/base/common/Pagination.java | 12 ++++++++++++ .../cn/cliveyuan/robin/base/util/BeanCopyUtils.java | 3 +++ .../generator/core/GeneratorContextResolver.java | 2 ++ .../robin/generator/db/MysqlTableIntrospect.java | 2 ++ 4 files changed, 19 insertions(+) diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/common/Pagination.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/common/Pagination.java index 4a27a26..2b64f41 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/common/Pagination.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/common/Pagination.java @@ -143,4 +143,16 @@ public class Pagination implements Serializable { ", hasNext=" + hasNext + '}'; } + + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } } diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/BeanCopyUtils.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/BeanCopyUtils.java index 50d836d..8b0d5a3 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/BeanCopyUtils.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/BeanCopyUtils.java @@ -76,6 +76,9 @@ public class BeanCopyUtils { pagination.setDataList(list); pagination.setTotalCount(sourcePagination.getTotalCount()); pagination.setHasNext(sourcePagination.isHasNext()); + pagination.setPageNo(sourcePagination.getPageNo()); + pagination.setPageSize(sourcePagination.getPageSize()); + pagination.setTotalPages(sourcePagination.getTotalPages()); return pagination; } } 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 51304a4..4fe92e6 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 @@ -1,5 +1,6 @@ package cn.cliveyuan.robin.generator.core; +import cn.cliveyuan.robin.base.util.AssertUtils; import cn.cliveyuan.robin.generator.db.ColumnInfo; import cn.cliveyuan.robin.generator.db.ConnectionFactory; import cn.cliveyuan.robin.generator.db.JdbcType; @@ -82,6 +83,7 @@ public class GeneratorContextResolver { private Entity table2Entity(CodeGeneratorXmlConfig.Table table) { TableInfo tableInfo = tableIntrospect.introspect(table.getTableName()); + AssertUtils.notNull(tableInfo, "Table may be not exist: " + table.getTableName()); Entity entity = new Entity(); String tableName = tableInfo.getName(); if (StringUtils.isNotBlank(table.getRemovePrefix()) && tableName.startsWith(table.getRemovePrefix())) { diff --git a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/db/MysqlTableIntrospect.java b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/db/MysqlTableIntrospect.java index b75a3f6..eaea814 100644 --- a/robin-generator/src/main/java/cn/cliveyuan/robin/generator/db/MysqlTableIntrospect.java +++ b/robin-generator/src/main/java/cn/cliveyuan/robin/generator/db/MysqlTableIntrospect.java @@ -40,6 +40,8 @@ public class MysqlTableIntrospect implements TableIntrospect { remarks = tableName; } tableInfo.setComment(remarks); + } else { + return null; } } List columns = new ArrayList(); -- Gitee From 48b1c2c367abd7db788cfab18e98d48f7186a9ef Mon Sep 17 00:00:00 2001 From: CliveYuan Date: Sat, 15 Jan 2022 14:44:52 +0800 Subject: [PATCH 2/2] finish enhancement for #I4Q1ZO --- doc/release-log.md | 7 + pom.xml | 2 +- robin-base/pom.xml | 4 +- .../cn/cliveyuan/robin/base/BaseMapper.java | 22 +++ .../cn/cliveyuan/robin/base/BaseService.java | 18 +++ .../cliveyuan/robin/base/BaseServiceImpl.java | 14 +- .../robin/base/condition/Compare.java | 20 --- .../robin/base/condition/Criterion.java | 153 ++++++++---------- .../base/condition/GeneratedCriteria.java | 96 ++++------- .../robin/base/condition/LambdaCriteria.java | 2 +- .../robin/base/provider/SqlProvider.java | 16 +- .../base/support/SqlProviderSupport.java | 96 +++++++---- .../cliveyuan/robin/base/util/SqlUtils.java | 9 ++ robin-base/src/main/resources/sql-segment.xml | 26 ++- robin-generator/pom.xml | 4 +- update_versions.sh | 2 +- 16 files changed, 281 insertions(+), 210 deletions(-) diff --git a/doc/release-log.md b/doc/release-log.md index 9fb15ff..d4d59da 100644 --- a/doc/release-log.md +++ b/doc/release-log.md @@ -9,3 +9,10 @@ - https://gitee.com/opensource4clive/robin/issues/I4NGRG - https://gitee.com/opensource4clive/robin/issues/I4NQ4V - https://gitee.com/opensource4clive/robin/issues/I4NQ4U + +## v1.3.0 2022-01-15 +- fix issues: + - https://gitee.com/opensource4clive/robin/issues/I4QXIL + - https://gitee.com/opensource4clive/robin/issues/I4Q1YQ +- enhancement: + - https://gitee.com/opensource4clive/robin/issues/I4Q1ZO diff --git a/pom.xml b/pom.xml index f2e6d61..492a0ea 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.gitee.opensource4clive robin pom - 1.2.4 + 1.3.0 robin Robin is a lightweight framework based on MyBatis that provides adding, deleting, modifying and querying capabilities. https://gitee.com/opensource4clive/robin diff --git a/robin-base/pom.xml b/robin-base/pom.xml index 459b1e5..54432c7 100644 --- a/robin-base/pom.xml +++ b/robin-base/pom.xml @@ -3,11 +3,11 @@ 4.0.0 robin-base jar - 1.2.4 + 1.3.0 com.gitee.opensource4clive robin - 1.2.3 + 1.3.0 diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseMapper.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseMapper.java index 3abc32a..440fa7b 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseMapper.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseMapper.java @@ -50,6 +50,18 @@ public interface BaseMapper { @Options(useGeneratedKeys = USE_GENERATED_KEYS, keyProperty = KEY_PROPERTY) int insertAll(T entity); + /** + * 选择性插入且忽略错误 + *

+ * 仅插入非null字段 + * + * @param entity 实体 + * @return + */ + @InsertProvider(SqlProvider.class) + @Options(useGeneratedKeys = USE_GENERATED_KEYS, keyProperty = KEY_PROPERTY) + int insertIgnore(T entity); + /** * 批量选择性插入 * @@ -60,6 +72,16 @@ public interface BaseMapper { @Options(useGeneratedKeys = USE_GENERATED_KEYS, keyProperty = KEY_PROPERTY) int batchInsert(@Param("list") List list); + /** + * 批量选择性插入且忽略错误 + * + * @param list 实体列表 + * @return + */ + @InsertProvider(SqlProvider.class) + @Options(useGeneratedKeys = USE_GENERATED_KEYS, keyProperty = KEY_PROPERTY) + int batchInsertIgnore(@Param("list") List list); + /** * 根据ID删除 * diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseService.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseService.java index f8a886a..7f91fd8 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseService.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseService.java @@ -38,6 +38,16 @@ public interface BaseService { */ int insertAll(T entity); + /** + * 选择性插入且忽略错误 + *

+ * 仅插入非null字段 + * + * @param entity 实体 + * @return + */ + int insertIgnore(T entity); + /** * 选择性保存 *

entity.id = null -> 插入

@@ -66,6 +76,14 @@ public interface BaseService { */ int batchInsert(List list); + /** + * 批量选择性插入且忽略错误 + * + * @param list 实体列表 + * @return + */ + int batchInsertIgnore(List list); + /** * 根据ID删除 * diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseServiceImpl.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseServiceImpl.java index 1a2e405..77e7c38 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseServiceImpl.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/BaseServiceImpl.java @@ -4,13 +4,13 @@ package cn.cliveyuan.robin.base; +import cn.cliveyuan.robin.base.common.Pagination; import cn.cliveyuan.robin.base.condition.Criteria; import cn.cliveyuan.robin.base.condition.Example; import cn.cliveyuan.robin.base.condition.GeneratedCriteria; import cn.cliveyuan.robin.base.condition.LambdaCriteria; import cn.cliveyuan.robin.base.condition.PageQueryExample; import cn.cliveyuan.robin.base.condition.Query; -import cn.cliveyuan.robin.base.common.Pagination; import cn.cliveyuan.robin.base.util.ReflectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.Assert; @@ -43,6 +43,12 @@ public class BaseServiceImpl implements BaseService { return baseMapper.insertAll(entity); } + @Override + public int insertIgnore(T entity) { + this.checkEntity(entity); + return baseMapper.insertIgnore(entity); + } + @Override public int save(T entity) { this.checkEntity(entity); @@ -61,6 +67,12 @@ public class BaseServiceImpl implements BaseService { return baseMapper.batchInsert(list); } + @Override + public int batchInsertIgnore(List list) { + this.checkEntityList(list); + return baseMapper.batchInsertIgnore(list); + } + @Override public int delete(Long id) { this.checkId(id); diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Compare.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Compare.java index 1a35357..461949d 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Compare.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Compare.java @@ -32,26 +32,6 @@ public interface Compare extends Serializable { */ Children ne(R column, Object val); - /** - * 等于 = - * (支持空字符串) - * - * @param column 字段 - * @param val 值 - * @return children - */ - Children eqBlankable(R column, Object val); - - /** - * 不等于 <> - * (支持空字符串) - * - * @param column 字段 - * @param val 值 - * @return children - */ - Children neBlankable(R column, Object val); - /** * 大于 > * diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Criterion.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Criterion.java index 8f597dc..aa80b99 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Criterion.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/condition/Criterion.java @@ -4,6 +4,9 @@ package cn.cliveyuan.robin.base.condition; +import cn.cliveyuan.robin.base.util.SqlUtils; +import org.springframework.util.Assert; + import java.util.List; import java.util.Objects; @@ -15,28 +18,78 @@ import java.util.Objects; */ public class Criterion { - private String condition; - - private Object value; - + private final String property; + private final String condition; + private final SqlKeyword sqlKeyword; + private final Object value; private Object secondValue; - private boolean noValue; - private boolean singleValue; - private boolean likeValue; - private boolean betweenValue; - private boolean listValue; + private SqlLike sqlLike; - private String typeHandler; + private Criterion(String property, Object value, SqlKeyword sqlKeyword) { + Assert.notNull(property, "property is required"); + Assert.notNull(sqlKeyword, "sqlKeyword is required"); + this.property = property; + this.value = value; + this.sqlKeyword = sqlKeyword; + this.condition = parseCondition(); + } - private SqlLike sqlLike; + private String parseCondition() { + return SqlUtils.contactCondition(property, sqlKeyword); + } - public String getCondition() { - return condition; + protected static Criterion build(String property, Object value, SqlKeyword sqlKeyword) { + Criterion criterion = new Criterion(property, value, sqlKeyword); + if (value instanceof List) { + criterion.listValue = true; + } else { + criterion.singleValue = true; + } + return criterion; + } + + protected static Criterion buildNoValue(String property, SqlKeyword sqlKeyword) { + Criterion criterion = build(property, null, sqlKeyword); + criterion.noValue = true; + return criterion; + } + + protected static Criterion buildLike(String property, Object value, SqlLike sqlLike, SqlKeyword sqlKeyword) { + Criterion criterion = build(property, value, sqlKeyword); + criterion.sqlLike = sqlLike; + criterion.likeValue = true; + criterion.singleValue = false; + return criterion; + } + + protected static Criterion buildBetween(String property, Object value, Object secondValue, SqlKeyword sqlKeyword) { + Criterion criterion = build(property, value, sqlKeyword); + criterion.secondValue = secondValue; + criterion.betweenValue = true; + criterion.singleValue = false; + return criterion; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Criterion criterion = (Criterion) o; + return noValue == criterion.noValue && singleValue == criterion.singleValue && likeValue == criterion.likeValue && betweenValue == criterion.betweenValue && listValue == criterion.listValue && Objects.equals(property, criterion.property) && Objects.equals(condition, criterion.condition) && sqlKeyword == criterion.sqlKeyword && Objects.equals(value, criterion.value) && Objects.equals(secondValue, criterion.secondValue) && sqlLike == criterion.sqlLike; + } + + @Override + public int hashCode() { + return Objects.hash(property, condition, sqlKeyword, value, secondValue, noValue, singleValue, likeValue, betweenValue, listValue, sqlLike); + } + + public String getProperty() { + return property; } public Object getValue() { @@ -63,10 +116,6 @@ public class Criterion { return listValue; } - public String getTypeHandler() { - return typeHandler; - } - public boolean isLikeValue() { return likeValue; } @@ -75,74 +124,12 @@ public class Criterion { return sqlLike; } - protected Criterion(String condition) { - super(); - this.condition = condition; - this.typeHandler = null; - this.noValue = true; - } - - protected Criterion(String condition, Object value, String typeHandler) { - this(condition, value, typeHandler, (SqlLike) null); - } - - protected Criterion(String condition, Object value, String typeHandler, SqlLike sqlLike) { - super(); - this.condition = condition; - this.value = value; - this.typeHandler = typeHandler; - if (Objects.nonNull(sqlLike)) { - this.likeValue = true; - this.sqlLike = sqlLike; - } else { - if (value instanceof List) { - this.listValue = true; - } else { - this.singleValue = true; - } - } - } - - protected Criterion(String condition, Object value) { - this(condition, value, (String) null); - } - - protected Criterion(String condition, Object value, SqlLike sqlLike) { - this(condition, value, null, sqlLike); - } - - protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { - super(); - this.condition = condition; - this.value = value; - this.secondValue = secondValue; - this.typeHandler = typeHandler; - this.betweenValue = true; - } - - protected Criterion(String condition, Object value, Object secondValue) { - this(condition, value, secondValue, null); + public SqlKeyword getSqlKeyword() { + return sqlKeyword; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Criterion criterion = (Criterion) o; - return noValue == criterion.noValue && - singleValue == criterion.singleValue && - likeValue == criterion.likeValue && - betweenValue == criterion.betweenValue && - listValue == criterion.listValue && - Objects.equals(condition, criterion.condition) && - Objects.equals(value, criterion.value) && - Objects.equals(secondValue, criterion.secondValue) && - Objects.equals(typeHandler, criterion.typeHandler) && - sqlLike == criterion.sqlLike; + public String getCondition() { + return condition; } - @Override - public int hashCode() { - return Objects.hash(condition, value, secondValue, noValue, singleValue, likeValue, betweenValue, listValue, typeHandler, sqlLike); - } } 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 0067018..1c935e6 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 @@ -8,6 +8,7 @@ import cn.cliveyuan.robin.base.util.RobinStrUtils; import cn.cliveyuan.robin.base.util.SqlUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; import java.util.ArrayList; import java.util.Collection; @@ -22,7 +23,6 @@ import java.util.Objects; */ @SuppressWarnings({"serial", "unchecked"}) public abstract class GeneratedCriteria implements Compare, Func { - private static final Logger LOGGER = LoggerFactory.getLogger(GeneratedCriteria.class); /** * 占位符 */ @@ -46,67 +46,39 @@ public abstract class GeneratedCriteria implements Compare Objects.equals(x.getCondition(), condition)); - criteria.add(new Criterion(condition, value)); + protected void addBetweenCriterion(R column, SqlKeyword sqlKeyword, Object value, Object secondValue) { + Assert.notNull(value, "Between firstValue is required"); + Assert.notNull(secondValue, "Between secondValue is required"); + addCriterion(this.columnToString(column), value, sqlKeyword, secondValue, false); } - protected void addLikeCriterion(SqlKeyword sqlKeyword, SqlLike sqlLike, Object value, R column) { - String columnName = this.columnToString(column); - if (value == null) { - LOGGER.debug("Value for '{}' is null, just skip this condition", columnName); - return; - } - if ((value instanceof String) && RobinStrUtils.isBlank((String) value)) { - LOGGER.debug("Value for '{}' is blank, just skip this condition", columnName); - return; + protected void addCriterion(String property, Object value, SqlKeyword sqlKeyword, Object secondValue, boolean noValue) { + criteria.removeIf(x -> Objects.equals(x.getCondition(), SqlUtils.contactCondition(property, sqlKeyword))); + Criterion criterion; + if (Objects.nonNull(secondValue)) { + criterion = Criterion.buildBetween(property, value, secondValue, sqlKeyword); + } else if (noValue) { + criterion = Criterion.buildNoValue(property, sqlKeyword); + } else { + criterion = Criterion.build(property, value, sqlKeyword); } - criteria.add(new Criterion(this.contactCondition(columnName, sqlKeyword), value, sqlLike)); + criteria.add(criterion); } - protected void addCriterion(String condition, Object value1, Object value2, String property) { - if (value1 == null || value2 == null) { - throw new RuntimeException("Between values for '" + property + "' cannot be null"); - } - criteria.add(new Criterion(condition, value1, value2)); - } - - public String contactCondition(String columnName, SqlKeyword sqlKeyword) { - SqlUtils.checkColumnName(columnName); - return String.format("`%s` %s", columnName, sqlKeyword.getKeyword()); + protected void addLikeCriterion(SqlKeyword sqlKeyword, SqlLike sqlLike, Object value, R column) { + criteria.add(Criterion.buildLike(this.columnToString(column), value, sqlLike, sqlKeyword)); } protected abstract String columnToString(R column); @@ -123,18 +95,6 @@ public abstract class GeneratedCriteria implements Compare implements Compare implements Compare extends GeneratedCriteria, Lam } public LambdaCriteria eq(String column, String val) { - this.addCriterion(this.contactCondition(column, SqlKeyword.EQ), val, column); + this.addCriterion(column, val, SqlKeyword.EQ); return this; } } diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/provider/SqlProvider.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/provider/SqlProvider.java index 58f06e3..7303f41 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/provider/SqlProvider.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/provider/SqlProvider.java @@ -28,11 +28,21 @@ public class SqlProvider implements ProviderMethodResolver { return SqlProviderSupport.getSqlScript("insertAll", providerContext); } + public String insertIgnore(ProviderContext providerContext, T entity) { + SqlProviderSupport.checkEntity(entity); + return SqlProviderSupport.getSqlScript("insertIgnore", providerContext); + } + public String batchInsert(ProviderContext providerContext, Map paramMap) { SqlProviderSupport.checkEntityList(paramMap); return SqlProviderSupport.getSqlScript("batchInsert", providerContext); } + public String batchInsertIgnore(ProviderContext providerContext, T entity) { + SqlProviderSupport.checkEntity(entity); + return SqlProviderSupport.getSqlScript("batchInsertIgnore", providerContext); + } + public String delete(ProviderContext providerContext, Map paramMap) { SqlProviderSupport.checkId(paramMap); return SqlProviderSupport.getSqlScript("delete", providerContext); @@ -82,11 +92,13 @@ public class SqlProvider implements ProviderMethodResolver { return SqlProviderSupport.getSqlScript("getByExample", providerContext); } - public String list(ProviderContext providerContext) { + public String list(ProviderContext providerContext, Map paramMap) { + SqlProviderSupport.filterCondition(paramMap); return SqlProviderSupport.getSqlScript("list", providerContext); } - public String count(ProviderContext providerContext) { + public String count(ProviderContext providerContext, Map paramMap) { + SqlProviderSupport.filterCondition(paramMap); return SqlProviderSupport.getSqlScript("count", providerContext); } diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/support/SqlProviderSupport.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/support/SqlProviderSupport.java index 4705079..643472e 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/support/SqlProviderSupport.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/support/SqlProviderSupport.java @@ -5,10 +5,12 @@ package cn.cliveyuan.robin.base.support; import cn.cliveyuan.robin.base.condition.ConditionExample; -import cn.cliveyuan.robin.base.util.AssertUtils; +import cn.cliveyuan.robin.base.condition.Criterion; +import cn.cliveyuan.robin.base.condition.GeneratedCriteria; import cn.cliveyuan.robin.base.util.ReflectUtils; import cn.cliveyuan.robin.base.util.SqlUtils; import org.apache.ibatis.builder.annotation.ProviderContext; +import org.springframework.util.Assert; import java.util.List; import java.util.Map; @@ -28,20 +30,31 @@ public class SqlProviderSupport { private static final Map SQL_CACHE = new ConcurrentHashMap<>(); public static String getSqlScript(String method, ProviderContext providerContext) { - return getSqlScript(method, getEntityClassFromProviderContext(providerContext)); + return doGetSqlScript(method, getEntityClassFromProviderContext(providerContext), null); } - public static String getSqlScript(String method, Class entityClass) { + public static String getSqlScript(String method, ProviderContext providerContext, Map extendParam) { + return doGetSqlScript(method, getEntityClassFromProviderContext(providerContext), extendParam); + } + + public static String doGetSqlScript(String method, Class entityClass, Map extendParam) { return SqlProviderSupport.getSqlScript(method, entityClass, () -> { ReflectEntity reflectEntity = ReflectUtils.resolveEntity(entityClass); ReflectEntityHelper reflectEntityHelper = reflectEntity.getReflectEntityHelper(); Map paramMap = reflectEntityHelper.getVariableMap(); + injectExtendParam(paramMap, extendParam); String sqlSegment = SqlUtils.getSqlSegmentMap().get(method); Objects.requireNonNull(sqlSegment, String.format("sqlSegment named '%s' is not exist", method)); return SqlUtils.resolveMapperScript(sqlSegment, paramMap); }); } + private static void injectExtendParam(Map paramMap, Map extendParam) { + if (Objects.nonNull(extendParam) && !extendParam.isEmpty()) { + paramMap.putAll(extendParam); + } + } + public static String getSqlScript(String method, Class clazz, Supplier supplier) { ReflectEntity reflectEntity = ReflectUtils.resolveEntity(clazz); String tableName = reflectEntity.getTableName(); @@ -53,27 +66,27 @@ public class SqlProviderSupport { }); } - public static Class getEntityClassFromEntity(Map paramMap) { - T entity = (T) paramMap.get("entity"); - AssertUtils.notNull(entity, "entity cant be null"); + public static Class getEntityClassFromEntity(Map paramMap) { + Object entity = paramMap.get("entity"); + Assert.notNull(entity, "entity cant be null"); return entity.getClass(); } - public static Class getEntityClassFromProviderContext(ProviderContext providerContext) { + public static Class getEntityClassFromProviderContext(ProviderContext providerContext) { return ReflectUtils.getClassGenericType(true, providerContext.getMapperType(), 0); } - public static Class getEntityClassFromMap(Map paramMap) { + public static Class getEntityClassFromMap(Map paramMap) { Class entityClass = (Class) paramMap.get("entityClass"); - AssertUtils.notNull(entityClass, "entityClass cant be null"); + Assert.notNull(entityClass, "entityClass cant be null"); return entityClass; } - public static Class getEntityClassFromList(Map paramMap) { - List list = (List) paramMap.get("list"); - AssertUtils.isTrue(list.size() > 0, "list is empty"); - T entity = list.get(0); - AssertUtils.notNull(entity, "entity in list cant be null"); + public static Class getEntityClassFromList(Map paramMap) { + List list = (List) paramMap.get("list"); + Assert.isTrue(list.size() > 0, "list is empty"); + Object entity = list.get(0); + Assert.notNull(entity, "entity in list cant be null"); return entity.getClass(); } @@ -82,10 +95,39 @@ public class SqlProviderSupport { * * @param paramMap 参数map */ - public static void checkCondition(Map paramMap) { - ConditionExample example = (ConditionExample) paramMap.get("example"); - AssertUtils.notNull(example, "example cant be null"); - AssertUtils.isTrue(example.getOredCriteria().size() > 0, "Condition can't be empty"); + public static void checkCondition(Map paramMap) { + ConditionExample example = (ConditionExample) paramMap.get("example"); + Assert.notNull(example, "example cant be null"); + List oredCriteria = example.getOredCriteria(); + Assert.isTrue(oredCriteria.size() > 0, "Condition can't be empty"); + for (GeneratedCriteria oredCriterion : oredCriteria) { + oredCriterion.getCriteria().forEach(x -> { + Criterion criterion = (Criterion) x; + if (!criterion.isNoValue()) { + Assert.notNull(criterion.getValue(), String.format("Value for '%s' can't be null", criterion.getProperty())); + } + }); + } + } + + /** + * 过滤条件, 过滤值为空的条件 + * + * @param paramMap 参数map + */ + public static void filterCondition(Map paramMap) { + ConditionExample example = (ConditionExample) paramMap.get("example"); + Assert.notNull(example, "example cant be null"); + List oredCriteria = example.getOredCriteria(); + if (oredCriteria.size() == 0) { + return; + } + for (GeneratedCriteria oredCriterion : oredCriteria) { + oredCriterion.getCriteria().removeIf(x -> { + Criterion criterion = (Criterion) x; + return !criterion.isNoValue() && Objects.isNull(criterion.getValue()); + }); + } } /** @@ -95,7 +137,7 @@ public class SqlProviderSupport { */ public static void checkIds(Map paramMap) { List ids = (List) paramMap.get("ids"); - AssertUtils.isTrue(Objects.nonNull(ids) && ids.size() > 0, "ids can't be empty"); + Assert.isTrue(Objects.nonNull(ids) && ids.size() > 0, "ids can't be empty"); } /** @@ -103,21 +145,21 @@ public class SqlProviderSupport { * * @param paramMap 参数map */ - public static void checkEntityList(Map paramMap) { - List list = (List) paramMap.get("list"); - AssertUtils.isTrue(Objects.nonNull(list) && list.size() > 0, "list can't be empty"); + public static void checkEntityList(Map paramMap) { + List list = (List) paramMap.get("list"); + Assert.isTrue(Objects.nonNull(list) && list.size() > 0, "list can't be empty"); } - public static void checkEntity(Map paramMap) { - checkEntity((T) paramMap.get("entity")); + public static void checkEntityMap(Map paramMap) { + checkEntity(paramMap.get("entity")); } - public static void checkEntity(T entity) { - AssertUtils.notNull(entity, "entity can't be empty"); + public static void checkEntity(Object entity) { + Assert.notNull(entity, "entity can't be empty"); } public static void checkId(Map paramMap) { Long id = (Long) paramMap.get("id"); - AssertUtils.notNull(id, "id can't be empty"); + Assert.notNull(id, "id can't be empty"); } } diff --git a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/SqlUtils.java b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/SqlUtils.java index 5feaba0..13a5e3f 100644 --- a/robin-base/src/main/java/cn/cliveyuan/robin/base/util/SqlUtils.java +++ b/robin-base/src/main/java/cn/cliveyuan/robin/base/util/SqlUtils.java @@ -4,8 +4,10 @@ package cn.cliveyuan.robin.base.util; +import cn.cliveyuan.robin.base.condition.SqlKeyword; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -161,4 +163,11 @@ public class SqlUtils { } return param.substring(0, 1).toUpperCase() + param.substring(1); } + + public static String contactCondition(String columnName, SqlKeyword sqlKeyword) { + Assert.notNull(columnName, "columnName is required"); + Assert.notNull(sqlKeyword, "sqlKeyword is required"); + SqlUtils.checkColumnName(columnName); + return String.format("`%s` %s", columnName, sqlKeyword.getKeyword()); + } } diff --git a/robin-base/src/main/resources/sql-segment.xml b/robin-base/src/main/resources/sql-segment.xml index 422d18f..3c83287 100644 --- a/robin-base/src/main/resources/sql-segment.xml +++ b/robin-base/src/main/resources/sql-segment.xml @@ -2,15 +2,27 @@ + + + @{conditionalFieldsString} + + + @{conditionalFieldsParamString} + + ]]> + + INSERT INTO `@{tableName}` (@{fieldsString}) VALUES (@{fieldsParamString}) - + @{conditionalFieldsString} @@ -30,6 +42,16 @@ ]]> + + + (@{itemFieldsParamString}) + + ]]> + + 4.0.0 robin-generator - 1.2.4 + 1.3.0 jar com.gitee.opensource4clive robin - 1.2.3 + 1.3.0 diff --git a/update_versions.sh b/update_versions.sh index 42769bf..47cc9f6 100755 --- a/update_versions.sh +++ b/update_versions.sh @@ -1,3 +1,3 @@ #!/bin/sh -mvn versions:set -DnewVersion=1.2.4 +mvn versions:set -DprocessAllModules=true -DnewVersion=1.3.0 -- Gitee