Jdbc3 KeyGenerator. processBatch() ⽅法将 SQL 语句执⾏后⽣成的主键记录到⽤户传递的实参中。
在 PreparedStatement 执⾏完 update 之后,将 SQL 语句执⾏后⽣成的主键记录到⽤户传递的时参数中。⼀般情况下,对应单⾏插⼊操作,传⼊的实参是⼀个 JavaBean 对象 或是 Map 对象,则将对象对应⼀次插⼊操作的内容;对于多⾏插⼊, 传⼊的实参可以是对象或 Map 对象的数组或集合,集合每⼀个元素都对应⼀次插操作。
public class Jdbc3KeyGenerator implements KeyGenerator {
/**
* A shared instance.
*
* @since 3.4.3
*/
public static final Jdbc3KeyGenerator INSTANCE = new Jdbc3KeyGenerator();
private static final String MSG_TOO_MANY_KEYS = "Too many keys are generated. There are only %d target objects. "
+ "You either specified a wrong 'keyProperty' or encountered a driver bug like #1523.";
@Override
public void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter) {
// do nothing
}
@Override
public void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter) {
processBatch(ms, stmt, parameter);
}
/**
* 在 PreparedStatement 执⾏完 update 之后,将 SQL 语句执⾏后⽣成的主键记录到⽤户传递的时参数中。
* ⼀般情况下,对应单⾏插⼊操作,传⼊的实参是⼀个 JavaBean 对象或是 Map 对象,则将对象对应⼀次插⼊操作的内容;
* 对于多⾏插⼊,传⼊的实参可以是对象或 Map 对象的数组或集合,集合每⼀个元素都对应⼀次插操作。
* @param ms
* @param stmt
* @param parameter
*/
public void processBatch(MappedStatement ms, Statement stmt, Object parameter) {
final String[] keyProperties = ms.getKeyProperties();
if (keyProperties == null || keyProperties.length == 0) {
return;
}
try (ResultSet rs = GeneratedKeys()) {
final ResultSetMetaData rsmd = rs.getMetaData();
final Configuration configuration = ms.getConfiguration();
if (ColumnCount() < keyProperties.length) {
// Error?
} el {
assignKeys(configuration, rs, rsmd, keyProperties, parameter);
柠檬蜂蜜水
}
} catch (Exception e) {
throw new ExecutorException("Error getting generated key or tting result to parameter object. Cau: " + e, e);
}
}
/**
* 处理不同类型结果实参;Map 类型、ArrayList 类型等等
* @param configuration
辞退公务员
* @param rs sql 执⾏结果集合
场地使用费* @param rsmd ResultSet 结果集合的每列的元属性,
* @param keyProperties 指定的⾃增主键 Id 对应 Java 对象属性
* @param parameter sql 数据库执⾏之后,数据库传回的参数
* @throws SQLException
*/
@SuppressWarnings("unchecked")
private void assignKeys(Configuration configuration, ResultSet rs, ResultSetMetaData rsmd, String[] keyProperties,
Object parameter) throws SQLException {
if (parameter instanceof ParamMap || parameter instanceof StrictMap) {
// Multi-param or single param with @Param
assignKeysToParamMap(configuration, rs, rsmd, keyProperties, (Map<String, ?>) parameter);
} el if (parameter instanceof ArrayList && !((ArrayList<?>) parameter).isEmpty()
&& ((ArrayList<?>) parameter).get(0) instanceof ParamMap) {
&& ((ArrayList<?>) parameter).get(0) instanceof ParamMap) {
// Multi-param or single param with @Param in batch operation
assignKeysToParamMapList(configuration, rs, rsmd, keyProperties, ((ArrayList<ParamMap<?>>) parameter)); } el {
// Single param without @Param
assignKeysToParam(configuration, rs, rsmd, keyProperties, parameter);
}
}
/**
* 处理 Java 对象或者 Bean 对象,⾮集合对象,单条数据情况
* @param configuration
* @param rs
* @param rsmd
* @param keyProperties
* @param parameter
* @throws SQLException
*/
private void assignKeysToParam(Configuration configuration, ResultSet rs, ResultSetMetaData rsmd,
String[] keyProperties, Object parameter) throws SQLException {
Collection<?> params = collectionize(parameter);
if (params.isEmpty()) {
return;
}
List<KeyAssigner> assignerList = new ArrayList<>();
for (int i = 0; i < keyProperties.length; i++) {
assignerList.add(new KeyAssigner(configuration, rsmd, i + 1, null, keyProperties[i]));
}
Iterator<?> iterator = params.iterator();
while (rs.next()) {
if (!iterator.hasNext()) {
throw new ExecutorException(String.format(MSG_TOO_MANY_KEYS, params.size()));
}
Object param = ();
assignerList.forEach(x -> x.assign(rs, param));
}
}
/**
* 处理 List 类型,遍历数据库⽣成的主键结果集,并设置到 Parameters 集合对应的元素的属性中
* @param configuration
* @param rs
* @param rsmd
* @param keyProperties
* @param paramMapList
* @throws SQLException
*/
private void assignKeysToParamMapList(Configuration configuration, ResultSet rs, ResultSetMetaData rsmd,
String[] keyProperties, ArrayList<ParamMap<?>> paramMapList) throws SQLException {
Iterator<ParamMap<?>> iterator = paramMapList.iterator();
List<KeyAssigner> assignerList = new ArrayList<>();
long counter = 0;
while (rs.next()) {
if (!iterator.hasNext()) {
throw new ExecutorException(String.format(MSG_TOO_MANY_KEYS, counter));
}
ParamMap<?> paramMap = ();
if (assignerList.isEmpty()) {
for (int i = 0; i < keyProperties.length; i++) {
assignerList
.add(getAssignerForParamMap(configuration, rsmd, i + 1, paramMap, keyProperties[i], keyProperties, fal) .getValue());
}
}
assignerList.forEach(x -> x.assign(rs, paramMap));
counter++;
高中学习计划
}
}
/**
* 处理 Map 类型,遍历数据库⽣成的主键结果集,并设置到 Parameters 集合对应的元素的属性中
* @param configuration
* @param rs
* @param rsmd
* @param rsmd
* @param keyProperties
* @param paramMap生日快乐成语
* @throws SQLException
*/
private void assignKeysToParamMap(Configuration configuration, ResultSet rs, ResultSetMetaData rsmd,
String[] keyProperties, Map<String, ?> paramMap) throws SQLException {
if (paramMap.isEmpty()) {
return;
}
高考语文作文题Map<String, Entry<Iterator<?>, List<KeyAssigner>>> assignerMap = new HashMap<>();
for (int i = 0; i < keyProperties.length; i++) {
Entry<String, KeyAssigner> entry = getAssignerForParamMap(configuration, rsmd, i + 1, paramMap, keyProperties[i], keyProperties, true);
Entry<Iterator<?>, List<KeyAssigner>> iteratorPair = Key(),
k -> entry((k)).iterator(), new ArrayList<>()));
}
long counter = 0;
while (rs.next()) {
for (Entry<Iterator<?>, List<KeyAssigner>> pair : assignerMap.values()) {
if (!Key().hasNext()) {
throw new ExecutorException(String.format(MSG_TOO_MANY_KEYS, counter));
}
Object param = Key().next();
}
counter++;
}
}
private Entry<String, KeyAssigner> getAssignerForParamMap(Configuration config, ResultSetMetaData rsmd,
int columnPosition, Map<String, ?> paramMap, String keyProperty, String[] keyProperties, boolean omitParamName) { boolean singleParam = paramMap.values().stream().distinct().count() == 1;
int firstDot = keyProperty.indexOf('.');
if (firstDot == -1) {
if (singleParam) {
return getAssignerForSingleParam(config, rsmd, columnPosition, paramMap, keyProperty, omitParamName);
}
throw new ExecutorException("Could not determine which parameter to assign generated keys to. "
+ "Note that when there are multiple parameters, 'keyProperty' must include the parameter name (e.
g. 'param.id'). " + "Specified key properties are " + String(keyProperties) + " and available parameters are "
+ paramMap.keySet());
窗花的剪法步骤图}
String paramName = keyProperty.substring(0, firstDot);
if (ainsKey(paramName)) {
String argParamName = omitParamName ? null : paramName;
String argKeyProperty = keyProperty.substring(firstDot + 1);
return entry(paramName, new KeyAssigner(config, rsmd, columnPosition, argParamName, argKeyProperty));
} el if (singleParam) {
return getAssignerForSingleParam(config, rsmd, columnPosition, paramMap, keyProperty, omitPara
mName);
} el {
throw new ExecutorException("Could not find parameter '" + paramName + "'. "
+ "Note that when there are multiple parameters, 'keyProperty' must include the parameter name (e.g. 'param.id'). " + "Specified key properties are " + String(keyProperties) + " and available parameters are "
英德九州驿站+ paramMap.keySet());
}
}
private Entry<String, KeyAssigner> getAssignerForSingleParam(Configuration config, ResultSetMetaData rsmd,
int columnPosition, Map<String, ?> paramMap, String keyProperty, boolean omitParamName) {
/
/ Assume 'keyProperty' to be a property of the single param.
String singleParamName = nameOfSingleParam(paramMap);
String argParamName = omitParamName ? null : singleParamName;
return entry(singleParamName, new KeyAssigner(config, rsmd, columnPosition, argParamName, keyProperty));
}
private static String nameOfSingleParam(Map<String, ?> paramMap) {
// There is virtually one parameter, so any key works.
return paramMap.keySet().iterator().next();
}
/**