Inserción por lotes de Spring JdbcTemplate cómo obtener el ID de crecimiento automático de la base de datos
# Lista pública saveOrUpdateAll(lista final de la lista) { Lista resultadoList=new ArrayList(); for(Test test: list){ resultList.add(save(test) } return resultList } Esto funciona bien. También consideré este enfoque, pero decidí:
getJdbcTemplate().update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement( Connection con) throws SQLException { PreparedStatement ps = con.prepareStatement( "insert into tb_test (nombre, sexo) valores (?,?)" ) establecidos en ".....", Statement.RETURN_GENERated_KEYS); ps.setString(1, test.getName()); ps.setString( 2. test.getSex()); return ps; }. Dado que Spring proporciona actualización por lotes, ¿habrá alguna ventaja de rendimiento durante el procesamiento por lotes? Se ha agregado la pregunta: la inserción del lote de primavera escrita por Feixue Qingqing es un poco limitada. Por ejemplo, creo que sus necesidades especiales no se pueden satisfacer, por lo que puede usar el método que mencioné anteriormente para lograrlo de manera indirecta. No creo que tenga mucho impacto en el rendimiento. Mire el método de excusa BatchPreparedStatementSetter setValues (PreparedStatement ps, int i) de la inserción por lotes de Spring, que proporciona un índice i. Debe haber sido atravesado, o cómo saber el valor de i. Entonces, cuando tenga necesidades especiales, utilice el método setValues(PreparedStatement ps, int i). Por lo tanto, cuando existe una necesidad especial de utilizar el programa anterior, no se recomienda utilizar la operación de procesamiento por lotes proporcionada por Spring. Lo hacemos en el proyecto. Después de leer estos dos métodos en el código fuente de Spring, siento que la encapsulación de esto no es muy completa y, de hecho, es demasiado limitada. Por ejemplo, cuando guardo en lotes, se puede insertar una parte y otra. Puede actualizarse en este momento, solo yo puedo seguir el método que mencionaste. En términos relativos, la capa de persistencia del marco ORM es más conveniente de usar.
//De hecho, pensé en ese método/** * @author BAOSJ * @date 2010-7-2 * @param sql * @param value * @param batchSize * @return * @throws Exception */ public List saveOrUpdateAll(String sql, List value, Integer batchSize) throws Exception { ResultSet rs = null; PreparedStatement ps = null; Devuelve los identificadores de los objetos a ejecutar List ids =; new ArrayList(); intente { conn = getConnection(); conn.setAutoCommit(false); ps = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS); ) { Objeto[] objetos = valores.j ) { ps.setObject(i 1, objetos[j] } if (i tamaño de lote == 0 || valores.tamaño().
);