fix: close #I7U37A

This commit is contained in:
开源海哥 2023-08-20 09:52:43 +08:00
parent 9387b76a8b
commit 9e50353f77
5 changed files with 52 additions and 113 deletions

View File

@ -73,19 +73,26 @@ public class CommonsDialectImpl implements IDialect {
@Override @Override
public String forInsertRow(String schema, String tableName, Row row) { public String forInsertRow(String schema, String tableName, Row row) {
StringBuilder fields = new StringBuilder(); StringBuilder fields = new StringBuilder();
StringBuilder questions = new StringBuilder(); StringBuilder paramsOrPlaceholder = new StringBuilder();
Set<String> modifyAttrs = RowCPI.getModifyAttrs(row); Set<String> modifyAttrs = RowCPI.getModifyAttrs(row);
int index = 0; int index = 0;
for (String attr : modifyAttrs) { for (String attr : modifyAttrs) {
fields.append(wrap(attr)); 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) { if (index != modifyAttrs.size() - 1) {
fields.append(DELIMITER); fields.append(DELIMITER);
questions.append(DELIMITER); paramsOrPlaceholder.append(DELIMITER);
} }
index++; index++;
} }
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO); sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
@ -93,7 +100,7 @@ public class CommonsDialectImpl implements IDialect {
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(getRealTable(tableName)));
sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT); 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(); return sql.toString();
} }

View File

@ -65,8 +65,11 @@ public class RowSqlProvider {
String tableName = ProviderUtil.getTableName(params); String tableName = ProviderUtil.getTableName(params);
String schema = ProviderUtil.getSchemaName(params); String schema = ProviderUtil.getSchemaName(params);
Row row = ProviderUtil.getRow(params); Row row = ProviderUtil.getRow(params);
// 先生成 SQL再设置参数
String sql = DialectFactory.getDialect().forInsertRow(schema, tableName, row);
ProviderUtil.setSqlArgs(params, RowCPI.obtainModifyValues(row)); ProviderUtil.setSqlArgs(params, RowCPI.obtainModifyValues(row));
return DialectFactory.getDialect().forInsertRow(schema, tableName, row); return sql;
} }
/** /**
@ -89,14 +92,16 @@ public class RowSqlProvider {
Set<String> modifyAttrs = new LinkedHashSet<>(RowCPI.getModifyAttrs(rows.get(0))); Set<String> modifyAttrs = new LinkedHashSet<>(RowCPI.getModifyAttrs(rows.get(0)));
rows.forEach(row -> row.keep(modifyAttrs)); 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[]{}; Object[] values = new Object[]{};
for (Row row : rows) { for (Row row : rows) {
values = ArrayUtil.concat(values, RowCPI.obtainModifyValues(row)); values = ArrayUtil.concat(values, RowCPI.obtainModifyValues(row));
} }
ProviderUtil.setSqlArgs(params, values); ProviderUtil.setSqlArgs(params, values);
//sql: INSERT INTO `tb_table`(`name`, `sex`) VALUES (?, ?),(?, ?),(?, ?) return sql;
return DialectFactory.getDialect().forInsertBatchWithFirstRowColumns(schema, tableName, rows);
} }
/** /**
@ -115,9 +120,9 @@ public class RowSqlProvider {
String tableName = ProviderUtil.getTableName(params); String tableName = ProviderUtil.getTableName(params);
String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); String[] primaryKeys = ProviderUtil.getPrimaryKeys(params);
String sql = DialectFactory.getDialect().forDeleteById(schema, tableName, primaryKeys);
ProviderUtil.setSqlArgs(params, primaryValues); ProviderUtil.setSqlArgs(params, primaryValues);
return sql;
return DialectFactory.getDialect().forDeleteById(schema, tableName, primaryKeys);
} }
/** /**
@ -133,8 +138,9 @@ public class RowSqlProvider {
String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); String[] primaryKeys = ProviderUtil.getPrimaryKeys(params);
Object[] primaryValues = ProviderUtil.getPrimaryValues(params); Object[] primaryValues = ProviderUtil.getPrimaryValues(params);
String sql = DialectFactory.getDialect().forDeleteBatchByIds(schema, tableName, primaryKeys, primaryValues);
ProviderUtil.setSqlArgs(params, primaryValues); ProviderUtil.setSqlArgs(params, primaryValues);
return DialectFactory.getDialect().forDeleteBatchByIds(schema, tableName, primaryKeys, primaryValues); return sql;
} }
/** /**
@ -152,7 +158,6 @@ public class RowSqlProvider {
//优先构建 sql再构建参数 //优先构建 sql再构建参数
String sql = DialectFactory.getDialect().forDeleteByQuery(queryWrapper); String sql = DialectFactory.getDialect().forDeleteByQuery(queryWrapper);
Object[] valueArray = CPI.getValueArray(queryWrapper); Object[] valueArray = CPI.getValueArray(queryWrapper);
ProviderUtil.setSqlArgs(params, valueArray); ProviderUtil.setSqlArgs(params, valueArray);
@ -170,8 +175,9 @@ public class RowSqlProvider {
String schema = ProviderUtil.getSchemaName(params); String schema = ProviderUtil.getSchemaName(params);
String tableName = ProviderUtil.getTableName(params); String tableName = ProviderUtil.getTableName(params);
Row row = ProviderUtil.getRow(params); Row row = ProviderUtil.getRow(params);
String sql = DialectFactory.getDialect().forUpdateById(schema, tableName, row);
ProviderUtil.setSqlArgs(params, RowCPI.obtainAllModifyValues(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 schema = ProviderUtil.getSchemaName(params);
String tableName = ProviderUtil.getTableName(params); String tableName = ProviderUtil.getTableName(params);
String sql = DialectFactory.getDialect().forUpdateBatchById(schema, tableName, rows);
Object[] values = FlexConsts.EMPTY_ARRAY; Object[] values = FlexConsts.EMPTY_ARRAY;
for (Row row : rows) { for (Row row : rows) {
values = ArrayUtil.concat(values, RowCPI.obtainAllModifyValues(row)); values = ArrayUtil.concat(values, RowCPI.obtainAllModifyValues(row));
} }
ProviderUtil.setSqlArgs(params, values); ProviderUtil.setSqlArgs(params, values);
return DialectFactory.getDialect().forUpdateBatchById(schema, tableName, rows); return sql;
} }
/** /**
@ -242,6 +250,8 @@ public class RowSqlProvider {
// 执行 onUpdate 监听器 // 执行 onUpdate 监听器
tableInfo.invokeOnUpdateListener(entity); tableInfo.invokeOnUpdateListener(entity);
String sql = DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false);
Object[] updateValues = tableInfo.buildUpdateSqlArgs(entity, false, false); Object[] updateValues = tableInfo.buildUpdateSqlArgs(entity, false, false);
Object[] primaryValues = tableInfo.buildPkSqlArgs(entity); Object[] primaryValues = tableInfo.buildPkSqlArgs(entity);
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); 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); FlexAssert.assertAreNotNull(primaryValues, "The value of primary key must not be null, entity[%s]", entity);
ProviderUtil.setSqlArgs(params, ArrayUtil.concat(updateValues, primaryValues, tenantIdArgs)); ProviderUtil.setSqlArgs(params, ArrayUtil.concat(updateValues, primaryValues, tenantIdArgs));
return sql;
return DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false);
} }
/** /**
@ -289,9 +298,10 @@ public class RowSqlProvider {
String[] primaryKeys = ProviderUtil.getPrimaryKeys(params); String[] primaryKeys = ProviderUtil.getPrimaryKeys(params);
Object[] primaryValues = ProviderUtil.getPrimaryValues(params); Object[] primaryValues = ProviderUtil.getPrimaryValues(params);
String sql = DialectFactory.getDialect().forSelectOneById(schema, tableName, primaryKeys, primaryValues);
ProviderUtil.setSqlArgs(params, primaryValues); ProviderUtil.setSqlArgs(params, primaryValues);
return DialectFactory.getDialect().forSelectOneById(schema, tableName, primaryKeys, primaryValues); return sql;
} }
/** /**

View File

@ -161,32 +161,6 @@ public class Row extends LinkedHashMap<String, Object> implements UpdateWrapper
return (Row) UpdateWrapper.super.setRaw(property, value, isEffective); 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 @Override
public Row set(String property, Object value) { public Row set(String property, Object value) {

View File

@ -24,6 +24,9 @@ import com.mybatisflex.core.query.QueryWrapper;
import java.io.Serializable; import java.io.Serializable;
/**
* @author michael
*/
public class RawValue implements Serializable { public class RawValue implements Serializable {
private Object object; private Object object;

View File

@ -20,100 +20,45 @@ import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.audit.ConsoleMessageCollector; import com.mybatisflex.core.audit.ConsoleMessageCollector;
import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.row.Row; import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.row.RowKey;
import com.mybatisflex.core.row.RowUtil; 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.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT;
public class RowTestStarter { public class RowTestStarter {
public static void main(String[] args) { @BeforeClass
public static void init() {
DataSource dataSource = new EmbeddedDatabaseBuilder() DataSource dataSource = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2) .setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql") .addScript("schema.sql")
.addScript("data.sql") .addScript("data.sql")
.build(); .build();
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance() MybatisFlexBootstrap.getInstance()
.setDataSource(dataSource) .setDataSource(dataSource)
// .setLogImpl(StdOutImpl.class) .setLogImpl(StdOutImpl.class)
.start(); .start();
AuditManager.setAuditEnable(true); AuditManager.setAuditEnable(true);
AuditManager.setMessageCollector(new ConsoleMessageCollector()); AuditManager.setMessageCollector(new ConsoleMessageCollector());
// Page<Row> 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<Row> rows = Db.selectListByQuery(query);
// RowUtil.printPretty(rows);
//
// System.out.println("--------");
//
// List<Account> accounts = RowUtil.toEntityList(rows, Account.class,0);
// System.out.println(accounts);
//
// List<Article> articles = RowUtil.toEntityList(rows, Article.class, 1);
// System.out.println(articles);
List<Row> 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<Row> 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<Row> rowList1 = Db.selectAll("tb_account");
rowList1.forEach(new Consumer<Row>() {
@Override
public void accept(Row row) {
row.remove("ID");
}
});
Db.insertBatch("tb_account", rowList1);
List<Row> 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<Row> rowList = Db.selectAll("tb_account");
RowUtil.printPretty(rowList);
} }
} }