From 9e50353f77548e992a34596f72e326e13febf239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Sun, 20 Aug 2023 09:52:43 +0800 Subject: [PATCH] fix: close #I7U37A --- .../core/dialect/impl/CommonsDialectImpl.java | 15 +++- .../core/provider/RowSqlProvider.java | 34 +++++--- .../java/com/mybatisflex/core/row/Row.java | 26 ------ .../com/mybatisflex/core/update/RawValue.java | 3 + .../com/mybatisflex/test/RowTestStarter.java | 87 ++++--------------- 5 files changed, 52 insertions(+), 113 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index 60c4b89e..35b9296f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -73,19 +73,26 @@ public class CommonsDialectImpl implements IDialect { @Override public String forInsertRow(String schema, String tableName, Row row) { StringBuilder fields = new StringBuilder(); - StringBuilder questions = new StringBuilder(); + StringBuilder paramsOrPlaceholder = new StringBuilder(); Set modifyAttrs = RowCPI.getModifyAttrs(row); int index = 0; for (String attr : modifyAttrs) { fields.append(wrap(attr)); - questions.append(PLACEHOLDER); + + Object value = row.get(attr); + if (value instanceof RawValue) { + paramsOrPlaceholder.append(((RawValue) value).toSql(this)); + } else { + paramsOrPlaceholder.append(PLACEHOLDER); + } if (index != modifyAttrs.size() - 1) { fields.append(DELIMITER); - questions.append(DELIMITER); + paramsOrPlaceholder.append(DELIMITER); } index++; } + StringBuilder sql = new StringBuilder(); sql.append(INSERT_INTO); if (StringUtil.isNotBlank(schema)) { @@ -93,7 +100,7 @@ public class CommonsDialectImpl implements IDialect { } sql.append(wrap(getRealTable(tableName))); sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT); - sql.append(VALUES).append(BRACKET_LEFT).append(questions).append(BRACKET_RIGHT); + sql.append(VALUES).append(BRACKET_LEFT).append(paramsOrPlaceholder).append(BRACKET_RIGHT); return sql.toString(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java index 0e4d42ff..476fb030 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/provider/RowSqlProvider.java @@ -65,8 +65,11 @@ public class RowSqlProvider { String tableName = ProviderUtil.getTableName(params); String schema = ProviderUtil.getSchemaName(params); Row row = ProviderUtil.getRow(params); + + // 先生成 SQL,再设置参数 + String sql = DialectFactory.getDialect().forInsertRow(schema, tableName, row); ProviderUtil.setSqlArgs(params, RowCPI.obtainModifyValues(row)); - return DialectFactory.getDialect().forInsertRow(schema, tableName, row); + return sql; } /** @@ -89,14 +92,16 @@ public class RowSqlProvider { Set modifyAttrs = new LinkedHashSet<>(RowCPI.getModifyAttrs(rows.get(0))); rows.forEach(row -> row.keep(modifyAttrs)); + //sql: INSERT INTO `tb_table`(`name`, `sex`) VALUES (?, ?),(?, ?),(?, ?) + String sql = DialectFactory.getDialect().forInsertBatchWithFirstRowColumns(schema, tableName, rows); + Object[] values = new Object[]{}; for (Row row : rows) { values = ArrayUtil.concat(values, RowCPI.obtainModifyValues(row)); } ProviderUtil.setSqlArgs(params, values); - //sql: INSERT INTO `tb_table`(`name`, `sex`) VALUES (?, ?),(?, ?),(?, ?) - return DialectFactory.getDialect().forInsertBatchWithFirstRowColumns(schema, tableName, rows); + return sql; } /** @@ -115,9 +120,9 @@ public class RowSqlProvider { String tableName = ProviderUtil.getTableName(params); String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); + String sql = DialectFactory.getDialect().forDeleteById(schema, tableName, primaryKeys); ProviderUtil.setSqlArgs(params, primaryValues); - - return DialectFactory.getDialect().forDeleteById(schema, tableName, primaryKeys); + return sql; } /** @@ -133,8 +138,9 @@ public class RowSqlProvider { String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); Object[] primaryValues = ProviderUtil.getPrimaryValues(params); + String sql = DialectFactory.getDialect().forDeleteBatchByIds(schema, tableName, primaryKeys, primaryValues); ProviderUtil.setSqlArgs(params, primaryValues); - return DialectFactory.getDialect().forDeleteBatchByIds(schema, tableName, primaryKeys, primaryValues); + return sql; } /** @@ -152,7 +158,6 @@ public class RowSqlProvider { //优先构建 sql,再构建参数 String sql = DialectFactory.getDialect().forDeleteByQuery(queryWrapper); - Object[] valueArray = CPI.getValueArray(queryWrapper); ProviderUtil.setSqlArgs(params, valueArray); @@ -170,8 +175,9 @@ public class RowSqlProvider { String schema = ProviderUtil.getSchemaName(params); String tableName = ProviderUtil.getTableName(params); Row row = ProviderUtil.getRow(params); + String sql = DialectFactory.getDialect().forUpdateById(schema, tableName, row); ProviderUtil.setSqlArgs(params, RowCPI.obtainAllModifyValues(row)); - return DialectFactory.getDialect().forUpdateById(schema, tableName, row); + return sql; } /** @@ -216,12 +222,14 @@ public class RowSqlProvider { String schema = ProviderUtil.getSchemaName(params); String tableName = ProviderUtil.getTableName(params); + String sql = DialectFactory.getDialect().forUpdateBatchById(schema, tableName, rows); + Object[] values = FlexConsts.EMPTY_ARRAY; for (Row row : rows) { values = ArrayUtil.concat(values, RowCPI.obtainAllModifyValues(row)); } ProviderUtil.setSqlArgs(params, values); - return DialectFactory.getDialect().forUpdateBatchById(schema, tableName, rows); + return sql; } /** @@ -242,6 +250,8 @@ public class RowSqlProvider { // 执行 onUpdate 监听器 tableInfo.invokeOnUpdateListener(entity); + String sql = DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false); + Object[] updateValues = tableInfo.buildUpdateSqlArgs(entity, false, false); Object[] primaryValues = tableInfo.buildPkSqlArgs(entity); Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); @@ -249,8 +259,7 @@ public class RowSqlProvider { FlexAssert.assertAreNotNull(primaryValues, "The value of primary key must not be null, entity[%s]", entity); ProviderUtil.setSqlArgs(params, ArrayUtil.concat(updateValues, primaryValues, tenantIdArgs)); - - return DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false); + return sql; } /** @@ -289,9 +298,10 @@ public class RowSqlProvider { String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); Object[] primaryValues = ProviderUtil.getPrimaryValues(params); + String sql = DialectFactory.getDialect().forSelectOneById(schema, tableName, primaryKeys, primaryValues); ProviderUtil.setSqlArgs(params, primaryValues); - return DialectFactory.getDialect().forSelectOneById(schema, tableName, primaryKeys, primaryValues); + return sql; } /** diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java index b10e2fd9..2bbaab76 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Row.java @@ -161,32 +161,6 @@ public class Row extends LinkedHashMap implements UpdateWrapper return (Row) UpdateWrapper.super.setRaw(property, value, isEffective); } -/*@Override - public Row set(String column, Object value) { - if (StringUtil.isBlank(column)) { - throw new IllegalArgumentException("key column not be null or empty."); - } - - SqlUtil.keepColumnSafely(column); - - if (value instanceof QueryWrapper || value instanceof QueryCondition || value instanceof QueryColumn) { - setRaw(column, value); - } else { - super.put(column, value); - } - - return this; - } - - @Override - public Row set(QueryColumn queryColumn, Object value) { - if (value instanceof QueryWrapper || value instanceof QueryCondition || value instanceof QueryColumn) { - setRaw(queryColumn, value); - } else { - super.put(queryColumn.getName(), value); - } - return this; - }*/ @Override public Row set(String property, Object value) { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/RawValue.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/RawValue.java index aaa72325..3d2a85f4 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/RawValue.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/RawValue.java @@ -24,6 +24,9 @@ import com.mybatisflex.core.query.QueryWrapper; import java.io.Serializable; +/** + * @author michael + */ public class RawValue implements Serializable { private Object object; diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/RowTestStarter.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/RowTestStarter.java index 2f26371e..3d65c19c 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/RowTestStarter.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/RowTestStarter.java @@ -20,100 +20,45 @@ import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.ConsoleMessageCollector; import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Row; -import com.mybatisflex.core.row.RowKey; import com.mybatisflex.core.row.RowUtil; +import org.apache.ibatis.logging.stdout.StdOutImpl; +import org.junit.BeforeClass; +import org.junit.Test; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; -import java.util.ArrayList; import java.util.List; -import java.util.function.Consumer; - -import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT; public class RowTestStarter { - public static void main(String[] args) { + @BeforeClass + public static void init() { DataSource dataSource = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("schema.sql") .addScript("data.sql") .build(); - MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance() + MybatisFlexBootstrap.getInstance() .setDataSource(dataSource) -// .setLogImpl(StdOutImpl.class) + .setLogImpl(StdOutImpl.class) .start(); AuditManager.setAuditEnable(true); AuditManager.setMessageCollector(new ConsoleMessageCollector()); - -// Page rowPage = Db.paginate("flex","tb_account", 1, 10, QueryWrapper.create().hint("USE_MERGE")); -// System.out.println(rowPage); + } - //查询 ID 为 1 的数据 -// Row row = Db.selectOneById("tb_account", "id", 1); -// System.out.println(row); - - -// QueryWrapper query = new QueryWrapper(); -// query.select().from(ACCOUNT).leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)); -// List rows = Db.selectListByQuery(query); -// RowUtil.printPretty(rows); -// -// System.out.println("--------"); -// -// List accounts = RowUtil.toEntityList(rows, Account.class,0); -// System.out.println(accounts); -// -// List
articles = RowUtil.toEntityList(rows, Article.class, 1); -// System.out.println(articles); - - - List rowList = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - Row row = Row.ofKey(RowKey.AUTO); - row.set(ACCOUNT.USER_NAME, "zhang" + i); - row.set(ACCOUNT.AGE, 18); - rowList.add(row); - } - - Db.insertBatch("tb_account", rowList); - - for (Row row : rowList) { - System.out.println(">>>>>>>id: " + row.get("id")); - } - - List rows1 = Db.selectAll("tb_account"); - RowUtil.printPretty(rows1); - - System.out.println("//////update...."); - - Row row = Row.ofKey("id", 5); - row.setRaw("age", "age + 5"); - Db.updateById("tb_account", row); - - Row row1 = Db.selectOneById("tb_account", "id", 5); - RowUtil.printPretty(row1); - - - System.out.println("////////////insert"); - List rowList1 = Db.selectAll("tb_account"); - rowList1.forEach(new Consumer() { - @Override - public void accept(Row row) { - row.remove("ID"); - } - }); - - Db.insertBatch("tb_account", rowList1); - - List rowList2 = Db.selectAll("tb_account"); - RowUtil.printPretty(rowList2); - + @Test + public void testSetRaw(){ + Row row = new Row(); + row.set("user_name","michael"); + row.setRaw("birthday","now()"); + Db.insert("tb_account",row); + List rowList = Db.selectAll("tb_account"); + RowUtil.printPretty(rowList); } }