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));