diff --git a/README.md b/README.md index e3ce5bf..7443795 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ veasion-db 是一个轻量级持久层ORM框架,除slf4j-api外不依赖任何 cn.veasion veasion-db - 1.1.9 + 1.2.0 ``` 支持sql解析生成veasion-db代码 diff --git a/pom.xml b/pom.xml index 4a4df02..fb47571 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ cn.veasion veasion-db - 1.1.9 + 1.2.0 veasion-db https://github.com/veasion/veasion-db diff --git a/src/main/java/cn/veasion/db/jdbc/DeleteSQL.java b/src/main/java/cn/veasion/db/jdbc/DeleteSQL.java index 731a0d9..e3b6ae6 100644 --- a/src/main/java/cn/veasion/db/jdbc/DeleteSQL.java +++ b/src/main/java/cn/veasion/db/jdbc/DeleteSQL.java @@ -2,7 +2,7 @@ import cn.veasion.db.update.Delete; -import java.util.HashMap; +import java.util.Collections; /** * DeleteSQL @@ -26,9 +26,7 @@ public static DeleteSQL build(Delete delete) { public DeleteSQL build() { this.reset(); sql.append("DELETE FROM ").append(getTableName(delete.getEntityClass(), delete, delete)).append(" WHERE"); - appendFilter(new HashMap>() {{ - put(null, delete.getEntityClass()); - }}, delete.getFilters()); + appendFilter(Collections.singletonMap(null, delete.getEntityClass()), delete.getFilters()); return this; } diff --git a/src/main/java/cn/veasion/db/jdbc/JdbcEntityDao.java b/src/main/java/cn/veasion/db/jdbc/JdbcEntityDao.java index 44d784a..d311983 100644 --- a/src/main/java/cn/veasion/db/jdbc/JdbcEntityDao.java +++ b/src/main/java/cn/veasion/db/jdbc/JdbcEntityDao.java @@ -96,7 +96,7 @@ public ID[] batchAdd(BatchEntityInsert batchEntityInsert) { if (idField == null) { return null; } - ID[] ids = (ID[]) Array.newInstance(idField.getType(), objects.length > 0 ? objects.length : entityList.size()); + ID[] ids = (ID[]) Array.newInstance(idField.getType(), objects.length > 0 ? objects.length : (entityList == null ? 0 : entityList.size())); if (objects.length > 0) { for (int i = 0; i < objects.length; i++) { ID id = (ID) TypeUtils.convert(objects[i], idField.getType()); @@ -105,7 +105,7 @@ public ID[] batchAdd(BatchEntityInsert batchEntityInsert) { ((IBaseId) entityList.get(i)).setId(id); } } - } else { + } else if (entityList != null) { for (int i = 0; i < entityList.size(); i++) { if (entityList.get(i) instanceof IBaseId) { Array.set(ids, i, ((IBaseId) entityList.get(i)).getId()); diff --git a/src/main/java/cn/veasion/db/jdbc/QuerySQL.java b/src/main/java/cn/veasion/db/jdbc/QuerySQL.java index be96ac0..f0f19a0 100644 --- a/src/main/java/cn/veasion/db/jdbc/QuerySQL.java +++ b/src/main/java/cn/veasion/db/jdbc/QuerySQL.java @@ -85,7 +85,7 @@ private void buildQuery() { sql.append(" ").append(tableAs); } // join - appendJoins(); + appendJoins(entityClassMap); sql.append(" WHERE"); // filter & join filter appendFilters(entityClassMap); @@ -144,26 +144,18 @@ private void appendSelects(Map> entityClassMap, boolean isExpre appendSelects(entityClassMap, query.getSelectExpression()); if (joins == null || joins.isEmpty()) return; for (JoinQueryParam join : joins) { - AbstractJoinQuery mainQuery = join.getMainQuery(); AbstractJoinQuery joinQuery = join.getJoinQuery(); if (joinQuery.getSelectExpression() != null) { - appendSelects(new HashMap>() {{ - put(mainQuery.getTableAs(), mainQuery.getEntityClass()); - put(joinQuery.getTableAs(), joinQuery.getEntityClass()); - }}, joinQuery.getSelectExpression()); + appendSelects(entityClassMap, joinQuery.getSelectExpression()); } } } else { appendSelects(entityClassMap, query.getSelects(), query.getAliasMap()); if (joins == null || joins.isEmpty()) return; for (JoinQueryParam join : joins) { - AbstractJoinQuery mainQuery = join.getMainQuery(); AbstractJoinQuery joinQuery = join.getJoinQuery(); if (!joinQuery.getSelects().isEmpty()) { - appendSelects(new HashMap>() {{ - put(mainQuery.getTableAs(), mainQuery.getEntityClass()); - put(joinQuery.getTableAs(), joinQuery.getEntityClass()); - }}, joinQuery.getSelects(), joinQuery.getAliasMap()); + appendSelects(entityClassMap, joinQuery.getSelects(), joinQuery.getAliasMap()); } } } @@ -227,10 +219,9 @@ private void appendSelects(Map> entityClassMap, List se sql.append(securityCheck(sb.toString())); } - private void appendJoins() { + private void appendJoins(Map> entityClassMap) { if (joins == null || joins.isEmpty()) return; for (JoinQueryParam join : joins) { - AbstractJoinQuery mainQuery = join.getMainQuery(); AbstractJoinQuery joinQuery = join.getJoinQuery(); sql.append(" ").append(join.getJoinType().getJoin()); if (joinQuery instanceof SubQuery) { @@ -246,10 +237,7 @@ private void appendJoins() { List filters = join.getOnFilters(); if (filters != null && filters.size() > 0) { sql.append(" ON"); - appendFilter(new HashMap>() {{ - put(mainQuery.getTableAs(), mainQuery.getEntityClass()); - put(joinQuery.getTableAs(), joinQuery.getEntityClass()); - }}, filters); + appendFilter(entityClassMap, filters); } } } @@ -258,16 +246,12 @@ private void appendFilters(Map> entityClassMap) { appendFilter(entityClassMap, query.getFilters()); if (joins == null || joins.isEmpty()) return; for (JoinQueryParam join : joins) { - AbstractJoinQuery mainQuery = join.getMainQuery(); AbstractJoinQuery joinQuery = join.getJoinQuery(); if (joinQuery.hasFilters()) { if (!endsWith(" WHERE")) { sql.append(" AND"); } - appendFilter(new HashMap>() {{ - put(mainQuery.getTableAs(), mainQuery.getEntityClass()); - put(joinQuery.getTableAs(), joinQuery.getEntityClass()); - }}, joinQuery.getFilters()); + appendFilter(entityClassMap, joinQuery.getFilters()); } } } diff --git a/src/main/java/cn/veasion/db/jdbc/UpdateSQL.java b/src/main/java/cn/veasion/db/jdbc/UpdateSQL.java index 7a28a7e..07eb974 100644 --- a/src/main/java/cn/veasion/db/jdbc/UpdateSQL.java +++ b/src/main/java/cn/veasion/db/jdbc/UpdateSQL.java @@ -65,7 +65,7 @@ public void buildUpdate() { entityClassMap.put(null, update.getEntityClass()); } // join on - appendJoinOn(); + appendJoinOn(entityClassMap); // set sql.append(" SET"); // update @@ -76,10 +76,9 @@ public void buildUpdate() { trimEndSql("WHERE"); } - private void appendJoinOn() { + private void appendJoinOn(Map> entityClassMap) { if (joins == null || joins.isEmpty()) return; for (JoinUpdateParam join : joins) { - EntityUpdate mainUpdate = join.getMainUpdate(); EntityUpdate joinUpdate = join.getJoinUpdate(); sql.append(" ").append(join.getJoinType().getJoin()); sql.append(" ").append(getTableName(joinUpdate.getEntityClass(), joinUpdate, join)); @@ -89,10 +88,7 @@ private void appendJoinOn() { List onFilters = join.getOnFilters(); if (onFilters != null && onFilters.size() > 0) { sql.append(" ON"); - appendFilter(new HashMap>() {{ - put(mainUpdate.getTableAs(), mainUpdate.getEntityClass()); - put(joinUpdate.getTableAs(), joinUpdate.getEntityClass()); - }}, onFilters); + appendFilter(entityClassMap, onFilters); } } } @@ -101,14 +97,10 @@ private void appendUpdateAll(Map> entityClassMap) { appendUpdates(entityClassMap, update.getUpdates()); if (joins == null || joins.isEmpty()) return; for (JoinUpdateParam join : joins) { - EntityUpdate mainUpdate = join.getMainUpdate(); EntityUpdate joinUpdate = join.getJoinUpdate(); if (joinUpdate.getUpdates() != null) { sql.append(","); - appendUpdates(new HashMap>() {{ - put(mainUpdate.getTableAs(), mainUpdate.getEntityClass()); - put(joinUpdate.getTableAs(), joinUpdate.getEntityClass()); - }}, joinUpdate.getUpdates()); + appendUpdates(entityClassMap, joinUpdate.getUpdates()); } } } @@ -135,16 +127,12 @@ private void appendFilters(Map> entityClassMap) { appendFilter(entityClassMap, update.getFilters()); if (joins == null || joins.isEmpty()) return; for (JoinUpdateParam join : joins) { - EntityUpdate mainUpdate = join.getMainUpdate(); EntityUpdate joinUpdate = join.getJoinUpdate(); if (joinUpdate.hasFilters()) { if (!endsWith(" WHERE")) { sql.append(" AND"); } - appendFilter(new HashMap>() {{ - put(mainUpdate.getTableAs(), mainUpdate.getEntityClass()); - put(joinUpdate.getTableAs(), joinUpdate.getEntityClass()); - }}, joinUpdate.getFilters()); + appendFilter(entityClassMap, joinUpdate.getFilters()); } } } diff --git a/src/main/java/cn/veasion/db/query/AbstractQuery.java b/src/main/java/cn/veasion/db/query/AbstractQuery.java index 1115fc2..323c78f 100644 --- a/src/main/java/cn/veasion/db/query/AbstractQuery.java +++ b/src/main/java/cn/veasion/db/query/AbstractQuery.java @@ -1,6 +1,7 @@ package cn.veasion.db.query; import cn.veasion.db.AbstractFilter; +import cn.veasion.db.DbException; import cn.veasion.db.base.Expression; import cn.veasion.db.base.Filter; import cn.veasion.db.jdbc.QuerySQL; @@ -26,6 +27,7 @@ public abstract class AbstractQuery> extends Abstract private boolean distinct; protected boolean selectAll; + private boolean asterisk = true; protected List selects = new ArrayList<>(); protected Map aliasMap = new HashMap<>(); private Set excludeSelects; @@ -47,6 +49,12 @@ public T selectAll() { return getSelf(); } + public T selectAllWithNoAsterisk() { + this.selectAll = true; + this.asterisk = false; + return getSelf(); + } + public T select(String field) { return select(field, null); } @@ -156,19 +164,21 @@ public T unionAll(AbstractQuery unionQuery) { public T page(PageParam pageParam) { this.pageParam = pageParam; + if (pageParam != null && (pageParam.getPage() <= 0 || pageParam.getSize() <= 0)) { + throw new DbException("分页参数page、size必须大于0"); + } return getSelf(); } public T page(int page, int size) { PageParam pageParam = ServiceLoaderUtils.pageParam(); if (pageParam != null) { - this.pageParam = pageParam; - this.pageParam.setPage(page); - this.pageParam.setSize(size); + pageParam.setPage(page); + pageParam.setSize(size); } else { - this.pageParam = new MysqlPage(page, size); + pageParam = new MysqlPage(page, size); } - return getSelf(); + return this.page(pageParam); } protected abstract String handleField(String field); @@ -225,10 +235,13 @@ public PageParam getPageParam() { @Override public void check(Class mainEntityClass) { if (selectAll && !checked) { - Map fieldColumns = FieldUtils.entityFieldColumns(getEntityClass() != null ? getEntityClass() : mainEntityClass); if (excludeSelects != null && excludeSelects.size() > 0) { + Map fieldColumns = FieldUtils.entityFieldColumns(getEntityClass() != null ? getEntityClass() : mainEntityClass); fieldColumns.keySet().stream().map(this::handleField).filter(k -> !excludeSelects.contains(k)).forEach(this::select); + } else if (asterisk) { + this.select(this.handleField("*")); } else { + Map fieldColumns = FieldUtils.entityFieldColumns(getEntityClass() != null ? getEntityClass() : mainEntityClass); fieldColumns.keySet().stream().map(this::handleField).forEach(this::select); } } diff --git a/src/main/java/cn/veasion/db/update/BatchEntityInsert.java b/src/main/java/cn/veasion/db/update/BatchEntityInsert.java index 85e1611..98d3a67 100644 --- a/src/main/java/cn/veasion/db/update/BatchEntityInsert.java +++ b/src/main/java/cn/veasion/db/update/BatchEntityInsert.java @@ -43,6 +43,9 @@ public BatchEntityInsert(List entityList, String... skipFields) { public BatchEntityInsert(AbstractQuery insertSelectQuery) { this.insertSelectQuery = Objects.requireNonNull(insertSelectQuery); + if (this.insertSelectQuery.isSelectAll()) { + this.insertSelectQuery.selectAllWithNoAsterisk(); + } } public BatchEntityInsert setUseGeneratedKeys(boolean useGeneratedKeys) { diff --git a/src/test/java/cn/veasion/db/query/JoinQueryTest.java b/src/test/java/cn/veasion/db/query/JoinQueryTest.java index 7909b3b..2edf8f0 100644 --- a/src/test/java/cn/veasion/db/query/JoinQueryTest.java +++ b/src/test/java/cn/veasion/db/query/JoinQueryTest.java @@ -12,7 +12,7 @@ import cn.veasion.db.model.vo.StudentVO; /** - * JoinQueryTest (join优化:建议用小表关联大表,最大join数不超过3) + * JoinQueryTest (join优化:mysql建议用小表关联大表(clickhouse相反),最大join数不超过3) * * @author luozhuowei * @date 2021/12/12 diff --git a/src/test/java/cn/veasion/db/query/SimpleQueryTest.java b/src/test/java/cn/veasion/db/query/SimpleQueryTest.java index 07f73b6..daf6a8b 100644 --- a/src/test/java/cn/veasion/db/query/SimpleQueryTest.java +++ b/src/test/java/cn/veasion/db/query/SimpleQueryTest.java @@ -15,10 +15,14 @@ public class SimpleQueryTest extends BaseTest { public static void main(String[] args) { - // 查询全部学生 + // 查询全部学生(*) // select * from t_student println(studentDao.queryList(new Q())); + // 查询全部学生(全部字段) + // select id, sno, name, class_id, sex, age, `desc`, version, is_deleted, create_time, update_time from t_student + println(studentDao.queryList(new Q().selectAllWithNoAsterisk())); + // 根据id查询学生 // select * from t_student where id = 1 println(studentDao.getById(1L));