batchSave批量保存可以返回保存数据的id的么,不可以的话,有什么方法可返回

batchSave批量保存可以返回保存数据的id的么,不可以的话,有什么方法可返回

评论区

JFinal

2018-08-14 17:26

batchSave 无法返因保存的 id, 只有 model.save() 以及 Db.save(record) 才可以

chcode

2023-06-27 18:28

@JFinal 貌似JdbcTemplate可以https://blog.csdn.net/allway2/article/details/127212115,jfinal中能否搞定?

chcode

2023-06-27 18:32

@JFinal 貌似重点在 PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 这里

JFinal

2023-06-27 20:53

@chcode 这些一直都可以,博主的需求是批量插入数据,获得所有批量数据的主键值,而不是一个

chcode

2023-06-28 11:39

@JFinal import com.jfinal.plugin.activerecord.*;

import java.sql.*;
import java.util.List;
import java.util.Map;

/**
* @date 2023/6/28 09:57
*/
public class CustomDbPro extends DbPro {
public CustomDbPro(String configName) {
super(configName);
}

@SuppressWarnings("rawtypes")
@Override
protected int[] batch(Config config, Connection conn, String sql, String columns, List list, int batchSize) throws SQLException {
if (list == null || list.size() == 0)
return new int[0];
Object element = list.get(0);
if (!(element instanceof Record) && !(element instanceof Model))
throw new IllegalArgumentException("The element in list must be Model or Record.");
if (batchSize < 1)
throw new IllegalArgumentException("The batchSize must more than 0.");
boolean isModel = element instanceof Model;

String[] columnArray = columns.split(",");
for (int i = 0; i < columnArray.length; i++)
columnArray[i] = columnArray[i].trim();

boolean isInTransaction = config.isInTransaction();
int counter = 0;
int pointer = 0;
int size = list.size();
int[] result = new int[size];
try (PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
for (int i = 0; i < size; i++) {
Map map = isModel ? CPI.getAttrs((Model) list.get(i)) : ((Record) list.get(i)).getColumns();
for (int j = 0; j < columnArray.length; j++) {
Object value = map.get(columnArray[j]);
if (value instanceof java.util.Date) {
if (value instanceof java.sql.Date) {
pst.setDate(j + 1, (java.sql.Date) value);
} else if (value instanceof java.sql.Timestamp) {
pst.setTimestamp(j + 1, (java.sql.Timestamp) value);
} else {
// Oracle、SqlServer 中的 TIMESTAMP、DATE 支持 new Date() 给值
java.util.Date d = (java.util.Date) value;
pst.setTimestamp(j + 1, new java.sql.Timestamp(d.getTime()));
}
} else {
pst.setObject(j + 1, value);
}
}
pst.addBatch();
if (++counter >= batchSize) {
counter = 0;
int[] r = pst.executeBatch();
if (!isInTransaction)
conn.commit();
//for (int j : r) {
// result[pointer++] = j;
//}
ResultSet rs = pst.getGeneratedKeys();
while (rs.next()) {
result[pointer++] = rs.getInt(1);
}
}
}
if (counter != 0) {
int[] r = pst.executeBatch();
if (!isInTransaction) {
conn.commit();
}
//for (int i : r) {
// result[pointer++] = i;
//}
ResultSet rs = pst.getGeneratedKeys();
while (rs.next()) {
result[pointer++] = rs.getInt(1);
}
}
return result;
}
}

}
实测这样重写后可以获取批量插入的主键列表

热门反馈

扫码入社