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
public String forInsertRow(String schema, String tableName, Row row) {
StringBuilder fields = new StringBuilder();
StringBuilder questions = new StringBuilder();
StringBuilder paramsOrPlaceholder = new StringBuilder();
Set<String> 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();
}

View File

@ -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<String> 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;
}
/**

View File

@ -161,32 +161,6 @@ public class Row extends LinkedHashMap<String, Object> 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) {

View File

@ -24,6 +24,9 @@ import com.mybatisflex.core.query.QueryWrapper;
import java.io.Serializable;
/**
* @author michael
*/
public class RawValue implements Serializable {
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.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<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);
}
}