需求:批量插入數據,並返回每條數據的主鍵(序列),因為這里是采用序列生成唯一的主鍵的,
其實oracle批量 插入操作有幾種,網上百度都是有相關資源的。但是筆者現在的需求是,不僅批量插入數據后,並返回每條數據的主鍵,
網上查閱了一番始終沒有找到,相應辦法,倒是針對mysql貌似mybatsi是支持批量返回主鍵的,因為筆者沒有測試,所有不敢妄下言論。
好了,說了這么多,直接進入正題:
1、參照網上的相關資源,如圖所示
<insert id="saveEPDetail" useGeneratedKeys="true" parameterType="java.util.List"> <selectKey keyProperty="code" resultType="String" order="BEFORE"> select SEQ_DIS_DRUG_PRESC_DETAIL.NEXTVAL as code from dual </selectKey> INSERT INTO DIS_DRUG_PRESC_DETAIL( code, antibac_purpose, ref_price, ) SELECT SEQ_DIS_DRUG_PRESC_DETAIL.NEXTVAL,t.* FROM ( <foreach collection="list" item="item" separator="UNION ALL"> select #{item.antibacPurpose,jdbcType=VARCHAR}, #{item.skintObserver2,jdbcType=VARCHAR} from dual </foreach> ) t </insert>
結果批量插入式成功了,單主鍵code打死都沒有返回,如是一條條插入又要加鎖
最后的解決方式:因為筆者這里是采用序列生成的主鍵,於是在插入數據的時候,先調用一下序列獲取到序列值,再賦值給主鍵code,最后進行批量插入操作。
如圖所示java dao:
/** * 獲取明細表主鍵 * * @return */ String getEpDetailCode();
xml:
<!--主鍵--> <select id="getEpDetailCode" resultType="java.lang.String"> select SEQ_DIS_DRUG_PRESC_DETAIL.NEXTVAL as code from dual </select>
最后問題終於解決的,若大家有好的方案歡迎指點E-mail dqcer@sina.com