Recentemente, fiz um requisito de importação em lote e inserindo vários registros no banco de dados.
Solução: encapsular um objeto de coleta de listas no programa e, em seguida, insira as entidades na coleção no banco de dados. Como o projeto usa Mybatis, ele está planejado para usar a função forEach da Mybatis para inserção em lote. Durante esse período, encontrei o erro "O comando SQL não terminou corretamente" e finalmente o resolvi e o gravei para revisão e aprendizagem futuros.
Primeiro, referenciei as informações sobre o mybatis 'foreach insert online, como segue:
A foreach é usada principalmente na construção em condições, pode iterar sobre uma coleção em declarações SQL.
Os atributos do elemento foreach incluem principalmente itens, índices, coleta, abertura, separador e fechamento.
O item representa o alias quando cada elemento da coleção é iterado. O índice especifica um nome para representar a posição na qual cada iteração é atingida durante o processo de iteração. O Open representa o que começa com a declaração, o separador representa quais símbolos são usados como separadores entre cada iteração e o fechamento representa o que termina. A coisa mais crítica e mais propensa a erros ao usar o foreach é o atributo de coleção. Esse atributo deve ser especificado, mas em diferentes casos, o valor do atributo é diferente. Existem três situações principais:
1. Se o passado passado em um único parâmetro e o tipo de parâmetro for uma lista, o valor do atributo de coleção é a lista
2. Se o passado em um único parâmetro e o tipo de parâmetro for uma matriz, o valor da propriedade da coleção é
3. Se houver vários parâmetros passados, precisamos encapsulá -los em um mapa. Obviamente, um único parâmetro também pode ser encapsulado em um mapa.
Em seguida, o arquivo XML a seguir foi escrito de acordo com a cópia.
xxxmapper.xml Arquivo:
<insert id = "addSupcity" parameterType = "java.util.list"> <selectKey KeyProperty = "CityId" Order = "Antes" ResultType = "String"> <! [CDATA [Select seq_ocl_supcity.nextVal de dual]]> </selecty> insert em t_ocity tity_ocity Are_desc, sup_id, stat) valores <foreach collection = "list" item = "item" index = "index" separator = ","> (#{item.cityId, jdbctype = varchar},#{item.cityCode, jdbctype = varchar},#{item.cityName, jdbctype = varchar},#{item .ArEADESC, JDBCTYPE = varchar},#{item.supid, jdbctype = varchar},#{item.stat, jdbctype = varchar}) </foreach> </nsert>No entanto, após a execução, continua a relatar erros e a mensagem de erro é a seguinte:
### sql: inserir em t_ocl_supcity (city_id, city_code, city_name, are_desc, sup_id, stat) valores (?,?,?,?,?,?), (?, Ou não:?,?,?,?,?,?,?,?,?
Copiar o SQL e a execução no PL/SQL também relata o mesmo erro. As can be seen above, SQL statements executed using batch insert are equivalent to: INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?), and in oracle insert into xxx values (xxx,xxx), (xxx,xxx) is incomparável. Olhando para esse artigo, descobri que isso é adequado para o MySQL e não para o Oracle, então modifiquei o arquivo XML:
<insert id = "addsupcity" parameterType = "java.util.list"> inserir em t_ocl_supcity (city_id, city_code, city_name, are_desc, sup_id, stat) select seq_ocl_supcity.nextval "city_id, a.*de (<para (para (stat) select (select) select =") select = ") select ="). #{item.cityCode, jdbctype = varchar} city_code,#{item.cityName, jdbctype = varchar} city_name,#{item.AReadesc, jdbctype = varchar} área,#{item.supid, jdbctype = varchar} aredesc,#{item.supid, jdbctype = Sup_id,#{item.stat, jdbctype = varchar} statfrom dual </ -foreach>) a </insert>Executar.
Na versão do Oracle, há algumas coisas a serem observadas:
1. Não há valores no SQL;
2. (Selece ...... do dual);
3. O atributo do separador na tag <foreach> é "Union all", e a consulta será mesclada no conjunto de resultados.
O exposto acima é uma solução rápida para o erro de inserção em lote do Oracle+Mybatis foreach Insert Função introduzida a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!