From 3f3e1a7d3df38ee7eb3c3c222e863fcee4c9223b Mon Sep 17 00:00:00 2001 From: wnp <280873834@qq.com> Date: Sun, 23 Apr 2023 09:38:33 +0800 Subject: [PATCH] feat(core): select default columns in baseMapper when no select columns is specified --- .../core/dialect/CommonsDialectImpl.java | 43 +++++++++++-------- .../core/provider/EntitySqlProvider.java | 1 + .../java/com/mybatisflex/core/query/CPI.java | 7 +++ .../com/mybatisflex/core/table/TableInfo.java | 18 ++++++++ .../core/table/TableInfoFactory.java | 8 ++++ .../mybatis-flex-spring-test/pom.xml | 6 +++ .../java/com/mybatisflex/test/AppConfig.java | 5 +++ .../com/mybatisflex/test/AccountTest.java | 20 ++++++++- 8 files changed, 87 insertions(+), 21 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/CommonsDialectImpl.java index 7d67c956..4abfaf8f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/CommonsDialectImpl.java @@ -272,21 +272,7 @@ public class CommonsDialectImpl implements IDialect { List selectColumns = CPI.getSelectColumns(queryWrapper); - StringBuilder sqlBuilder = new StringBuilder("SELECT "); - if (selectColumns == null || selectColumns.isEmpty()) { - sqlBuilder.append("*"); - } else { - int index = 0; - - for (QueryColumn selectColumn : selectColumns) { - String selectColumnSql = CPI.toSelectSql(selectColumn, allTables, this); - sqlBuilder.append(selectColumnSql); - if (index != selectColumns.size() - 1) { - sqlBuilder.append(", "); - } - index++; - } - } + StringBuilder sqlBuilder = buildSelectColumnSql(allTables, selectColumns); sqlBuilder.append(" FROM ").append(StringUtil.join(", ", queryTables, queryTable -> queryTable.toSql(this))); buildJoinSql(sqlBuilder, queryWrapper, allTables); @@ -312,6 +298,25 @@ public class CommonsDialectImpl implements IDialect { return sqlBuilder.toString(); } + private StringBuilder buildSelectColumnSql(List queryTables, List selectColumns) { + StringBuilder sqlBuilder = new StringBuilder("SELECT "); + if (selectColumns == null || selectColumns.isEmpty()) { + sqlBuilder.append("*"); + } else { + int index = 0; + + for (QueryColumn selectColumn : selectColumns) { + String selectColumnSql = CPI.toSelectSql(selectColumn, queryTables, this); + sqlBuilder.append(selectColumnSql); + if (index != selectColumns.size() - 1) { + sqlBuilder.append(", "); + } + index++; + } + } + return sqlBuilder; + } + @Override public String buildSelectCountSql(QueryWrapper queryWrapper) { @@ -663,8 +668,8 @@ public class CommonsDialectImpl implements IDialect { @Override public String forSelectOneEntityById(TableInfo tableInfo) { - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(wrap(tableInfo.getTableName())); + StringBuilder sql = buildSelectColumnSql(null, tableInfo.getDefaultQueryColumn()); + sql.append(" FROM ").append(wrap(tableInfo.getTableName())); sql.append(" WHERE "); String[] pKeys = tableInfo.getPrimaryKeys(); for (int i = 0; i < pKeys.length; i++) { @@ -692,8 +697,8 @@ public class CommonsDialectImpl implements IDialect { @Override public String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues) { - StringBuilder sql = new StringBuilder("SELECT * FROM "); - sql.append(wrap(tableInfo.getTableName())); + StringBuilder sql = buildSelectColumnSql(null, tableInfo.getDefaultQueryColumn()); + sql.append(" FROM ").append(wrap(tableInfo.getTableName())); sql.append(" WHERE "); String[] primaryKeys = tableInfo.getPrimaryKeys(); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java index b968ec9d..552578f3 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/EntitySqlProvider.java @@ -315,6 +315,7 @@ public class EntitySqlProvider { Object[] values = CPI.getValueArray(queryWrapper); ProviderUtil.setSqlArgs(params, values); + CPI.setSelectColumnsIfNecessary(queryWrapper, tableInfo.getDefaultQueryColumn()); CPI.setFromIfNecessary(queryWrapper, tableInfo.getTableName()); return DialectFactory.getDialect().forSelectListByQuery(queryWrapper); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java index f5227efb..67e23b88 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java @@ -63,6 +63,13 @@ public class CPI { queryWrapper.setSelectColumns(selectColumns); } + public static void setSelectColumnsIfNecessary(QueryWrapper queryWrapper, List selectColumns) { + if (CollectionUtil.isEmpty(queryWrapper.getSelectColumns()) + && CollectionUtil.isNotEmpty(selectColumns)) { + queryWrapper.setSelectColumns(selectColumns); + } + } + public static List getJoins(QueryWrapper queryWrapper) { return queryWrapper.getJoins(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index 8c196831..0c2d2555 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -38,6 +38,7 @@ import org.apache.ibatis.session.Configuration; import org.apache.ibatis.type.TypeHandler; import java.util.*; +import java.util.stream.Collectors; public class TableInfo { @@ -71,6 +72,9 @@ public class TableInfo { //主键字段 private String[] primaryKeys = new String[0]; + // 默认查询列 + private String[] defaultColumns = new String[0]; + //在插入数据的时候,支持主动插入的主键字段 //通过自定义生成器生成 或者 Sequence 在 before 生成的时候,是需要主动插入数据的 private String[] insertPrimaryKeys; @@ -183,6 +187,14 @@ public class TableInfo { this.largeColumns = largeColumns; } + public String[] getDefaultColumns() { + return defaultColumns; + } + + public void setDefaultColumns(String[] defaultColumns) { + this.defaultColumns = defaultColumns; + } + public String[] getInsertPrimaryKeys() { return insertPrimaryKeys; } @@ -588,6 +600,12 @@ public class TableInfo { return joiner.toString(); } + public List getDefaultQueryColumn() { + return Arrays.stream(defaultColumns) + .map(name -> new QueryColumn(getTableName(), name)) + .collect(Collectors.toList()); + } + public ResultMap buildResultMap(Configuration configuration) { String resultMapId = entityClass.getName(); List resultMappings = new ArrayList<>(); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java index 2669e496..836312cd 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java @@ -159,6 +159,8 @@ public class TableInfoFactory { //大字段列 Set largeColumns = new LinkedHashSet<>(); + // 默认查询列 + Set defaultColumns = new LinkedHashSet<>(); List entityFields = ClassUtil.getAllFields(entityClass); @@ -230,6 +232,9 @@ public class TableInfoFactory { largeColumns.add(columnName); } + if (column == null || (!column.isLarge() && !column.isLogicDelete())) { + defaultColumns.add(columnName); + } Id id = field.getAnnotation(Id.class); ColumnInfo columnInfo; @@ -301,6 +306,9 @@ public class TableInfoFactory { if (!largeColumns.isEmpty()) { tableInfo.setLargeColumns(largeColumns.toArray(new String[0])); } + if (!defaultColumns.isEmpty()) { + tableInfo.setDefaultColumns(defaultColumns.toArray(new String[0])); + } tableInfo.setColumnInfoList(columnInfoList); tableInfo.setPrimaryKeyList(idInfos); diff --git a/mybatis-flex-test/mybatis-flex-spring-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-test/pom.xml index d33ac97e..2baceac2 100644 --- a/mybatis-flex-test/mybatis-flex-spring-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-test/pom.xml @@ -57,6 +57,12 @@ junit test + + org.assertj + assertj-core + 3.22.0 + test + diff --git a/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/AppConfig.java b/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/AppConfig.java index d1e4fbc2..d8d89983 100644 --- a/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/AppConfig.java +++ b/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/AppConfig.java @@ -15,7 +15,9 @@ */ package com.mybatisflex.test; +import com.mybatisflex.core.mybatis.FlexConfiguration; import com.mybatisflex.spring.FlexSqlSessionFactoryBean; +import org.apache.ibatis.logging.stdout.StdOutImpl; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; @@ -48,6 +50,9 @@ public class AppConfig implements ApplicationListener { // SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); SqlSessionFactoryBean factoryBean = new FlexSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); + FlexConfiguration configuration = new FlexConfiguration(); + configuration.setLogImpl(StdOutImpl.class); + factoryBean.setConfiguration(configuration); return factoryBean.getObject(); } diff --git a/mybatis-flex-test/mybatis-flex-spring-test/src/test/java/com/mybatisflex/test/AccountTest.java b/mybatis-flex-test/mybatis-flex-spring-test/src/test/java/com/mybatisflex/test/AccountTest.java index b114dbd6..2788f1aa 100644 --- a/mybatis-flex-test/mybatis-flex-spring-test/src/test/java/com/mybatisflex/test/AccountTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-test/src/test/java/com/mybatisflex/test/AccountTest.java @@ -1,18 +1,24 @@ package com.mybatisflex.test; +import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Row; import com.mybatisflex.test.mapper.AccountMapper; import com.mybatisflex.test.model.Account; +import org.assertj.core.api.WithAssertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.util.List; + +import static com.mybatisflex.test.model.table.Tables.ACCOUNT; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) -public class AccountTest { +public class AccountTest implements WithAssertions { @Autowired AccountMapper accountMapper; @@ -20,7 +26,17 @@ public class AccountTest { @Test public void testSelectOne() { Account account = accountMapper.selectOneById(1); - System.out.println(account); + assertThat(account).isNotNull() + .satisfies(a -> assertThat(a.getId()).isEqualTo(1)); + } + + @Test + public void testSelectByQuery() { + QueryWrapper queryWrapper = QueryWrapper.create() + .where(ACCOUNT.AGE.eq(18)); + List accounts = accountMapper.selectListByQuery(queryWrapper); + assertThat(accounts.size()).isEqualTo(1); + assertThat(accounts.get(0).getAge()).isEqualTo(18); } @Test