最近、バッチインポート要件を作成し、データベースに複数のレコードを挿入するバッチを作成しました。
解決策:プログラム内のリストコレクションオブジェクトをカプセル化し、コレクション内のエンティティをデータベースに挿入します。プロジェクトはMyBatisを使用しているため、バッチ挿入にMyBatisのForeach関数を使用することが計画されています。この期間中、「SQLコマンドは正しく終了しなかった」というエラーに遭遇し、最終的にそれを解決し、将来のレビューと学習のために記録しました。
最初に、次のように、MyBatisのオンラインでのforeach挿入に関する情報を参照しました。
Foreachは主に条件の構築に使用され、SQLステートメントのコレクションを反復することができます。
foreach要素の属性には、主にアイテム、インデックス、コレクション、オープン、セパレーター、およびクローズが含まれます。
アイテムは、コレクション内の各要素が繰り返されるときのエイリアスを表します。インデックスは、反復プロセス中に各反復に到達する位置を表す名前を指定します。 Openは、ステートメントから始まるものを表し、セパレーターは各反復の間でセパレーターとして使用されるシンボルを表し、クローズは終了するものを表します。 Foreachを使用する際の最も重要で最もエラーが発生しやすいものは、コレクション属性です。この属性を指定する必要がありますが、さまざまな場合、属性の値は異なります。 3つの主な状況があります。
1.単一のパラメーターで渡され、パラメータータイプがリストである場合、コレクション属性値はリストです
2。単一のパラメーターで渡され、パラメータータイプが配列である場合、コレクションのプロパティ値は配列です
3.複数のパラメーターが渡された場合、それらをマップにカプセル化する必要があります。もちろん、単一のパラメーターをマップにカプセル化することもできます。
次に、次のXMLファイルがコピーに従って記述されました。
xxxmapper.xmlファイル:
<ID = "addsupcity" parametertype = "java.util.list"> <selectkey keyproperty = "cityid" order = "resulttype =" string "> <![cdata [selece seq_ocl_supcity.nextval from dual]]> </selectkey ARIEF_DESC、sup_id、stat)values <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> </insert>ただし、実行後、エラーの報告を続け、エラーメッセージは次のとおりです。
### sql:t_ocl_supcity(city_id、city_code、city_name、area_desc、sup_id、stat)values(?、?、?、?、?)、(?、?、?、?、?、?、?、)
PL/SQLでSQLをコピーして実行すると、同じエラーも報告されています。上記のように、バッチ挿入を使用して実行されたSQLステートメントは、T_OCL_SUPCITY(city_id、city_code、city_name、area_desc、sup_id、stat)値(?、?、?、?、?)、(?、?、?、?)に挿入されます。比類のない。その記事を振り返ってみると、これはOracleではなくMySQLに適していることがわかりました。したがって、XMLファイルを変更しました。
<ID = "addsupcity" parametertype = "java.util.list"> t_ocl_supcityに挿入(city_id、city_code、city_name、reagy_desc、sup_id、stat)select selece selece seq_ocl_supcity.nextval city_id、 #{item.citycode、jdbctype = varchar} city_code、#{item.cityname、jdbctype = varchar} city_name、#{item.areadesc、jdbctype = varchar} area_desc、#{item.supid、jdbctype = varchar} sup_id、#{item.stat、jdbctype = varchar} statfrom dual </foreach>)a </insert>通り抜けます。
Oracleのバージョンには、注意すべきことがいくつかあります。
1. SQLには値はありません。
2。(Selece ...... Dualから);
3. <foreach>タグのセパレーターの属性は「ユニオンALL」であり、クエリは結果セットにマージされます。
上記は、編集者が紹介したOracle+MyBatis Foreach Insert機能のバッチインサートエラーの簡単なソリューションです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!