Oracle+Mybatis组合使用
前言
Oracle+Mybatis组合使用进行批量插入
一、使用步骤
对于Mybatis+Oralce 的组合,由于oracle没有自动生成主键的功能所以只能借由序列产生数值,来代替mysql当中的类似功能,对于使用foreach这个myabtis提供的标签只能使用List进行值的传入,并且separator需要使用union all 进行分割,又因为oracle对于任何sql语句都需要存放到一个包含有from的sql当中所以对于每次循环生成的语句都需要放入dual临时表当中,并且在insert标签上需要将usegeneratekey标签设置为false因为Oracle不支持自动生成的主键。如果不设置这个值会导致报错。又因为序列的生成也放入foreache标签当中会出现“该处不能放置序列”的异常所以又只能将内部的多个联合查询的sql放入一个子查询,在放入子查询时需要将通名列设置别名防止列明冲突,在外层的查询上在添加 序列的nextval语句,如此才能正常的生成一条能够插入多条数据的sql.
useGeneratedKeys=“false” 需要设置为false否则会报错
代码如下(示例):
<!--通过List将数据批量插入数据库当中 -->
<!--<insert id="addDingDanMX" parameterType="java.util.ArrayList" useGeneratedKeys="false">
INSERT INTO USE_ITEM_ORDERS_LINE (
id
,HEADER_ID
,CREATE_DATE
,LAST_UPDATE_DATE
,CREATE_BY
,LAST_UPDATE_BY
,ITEM_CODE
,ITEM_DESC
,UNIT
,QUANTITY
,STOCK_UP_QTY
,REMARKS
,ORG_CODE
,FACTORY
,TARGET_SUBINVENTORY
,TARGET_LOCATION
,ISDELETE
,ISCLOSE
,NEED_DATE
)
select USE_ITEM_ORDERS_LINE_S.nextval,A.* from (
<foreach collection="list" item="temp" index="index" separator="UNION ALL">
select
${temp.HEADER_ID},sysdate CREATE_DATE,sysdate LAST_UPDATE_DATE
<if test="temp.CREATE_BY != null">,#{temp.CREATE_BY} CREATE_BY</if>
<if test="temp.LAST_UPDATE_BY != null">,#{temp.LAST_UPDATE_BY} LAST_UPDATE_BY</if>
<if test="temp.ITEM_CODE != null">,#{temp.ITEM_CODE}</if>
<if test="temp.ITEM_DESC != null">,#{temp.ITEM_DESC}</if>
<if test="temp.UNIT != null">,#{temp.UNIT}</if>
<if test="temp.QUANTITY != null">,${temp.QUANTITY}</if>
<if test="temp.STOCK_UP_QTY != null">,${temp.STOCK_UP_QTY} STOCK_UP_QTY</if>
<if test="temp.REMARKS != null">,#{temp.REMARKS}</if>
<if test="temp.ORG_CODE != null">,#{temp.ORG_CODE}</if>
<if test="temp.FACTORY != null">,#{temp.FACTORY}</if>
<if test="temp.TARGET_SUBINVENTORY != null">,#{temp.TARGET_SUBINVENTORY}</if>
<if test="temp.TARGET_LOCATION != null">,#{temp.TARGET_LOCATION}</if>
<if test="temp.ISDELETE != null">,${temp.ISDELETE} ISDELETE</if>
<if test="temp.ISCLOSE != null">,${temp.ISCLOSE} ISCLOSE</if>
<if test="temp.NEED_DATE != null">,#{temp.NEED_DATE}</if>
from dual
</foreach>
) A
-->
2.最终生成的sql
代码如下(示例):
INSERT INTO USE_ITEM_ORDERS_LINE
(ID,
HEADER_ID,
CREATE_DATE,
LAST_UPDATE_DATE,
CREATE_BY,
LAST_UPDATE_BY,
ITEM_CODE,
ITEM_DESC,
UNIT,
QUANTITY,
STOCK_UP_QTY,
REMARKS,
ORG_CODE,
FACTORY,
TARGET_SUBINVENTORY,
TARGET_LOCATION,
ISDELETE,
ISCLOSE,
NEED_DATE)
SELECT USE_ITEM_ORDERS_LINE_S.NEXTVAL, A.*
FROM (SELECT 249,
SYSDATE CREATE_DATE,
SYSDATE LAST_UPDATE_DATE,
'5781' CREATE_BY,
'5781' LAST_UPDATE_BY,
'**',
'测试001',
'件',
1,
0 STOCK_UP_QTY,
'',
'****',
'**',
'**',
'**',
0 ISDELETE,
0 ISCLOSE,
'2021-01-03'
FROM DUAL
UNION ALL
SELECT 249,
SYSDATE CREATE_DATE,
SYSDATE LAST_UPDATE_DATE,
'5781' CREATE_BY,
'5781' LAST_UPDATE_BY,
'*********',
'**',
'**',
1,
0 STOCK_UP_QTY,
'',
'**','**','**','**',
0 ISDELETE,
0 ISCLOSE,
'2021-01-03'
FROM DUAL
UNION ALL
SELECT 249,
SYSDATE CREATE_DATE,
SYSDATE LAST_UPDATE_DATE,
'5781' CREATE_BY,
'5781' LAST_UPDATE_BY,
'*****',
'测试001',
'件',
1,
0 STOCK_UP_QTY,
'',
'**','**','**','**',
0 ISDELETE,
0 ISCLOSE,
'2021-01-03'
FROM DUAL
UNION ALL
SELECT 249,
SYSDATE CREATE_DATE,
SYSDATE LAST_UPDATE_DATE,
'5781' CREATE_BY,
'5781' LAST_UPDATE_BY,
'**************',
'*******',
'件',
1,
0 STOCK_UP_QTY,
'',
'**','**','**','**',
0 ISDELETE,
0 ISCLOSE,
'2021-01-03'
FROM DUAL
UNION ALL
SELECT 249,
SYSDATE CREATE_DATE,
SYSDATE LAST_UPDATE_DATE,
'5781' CREATE_BY,
'5781' LAST_UPDATE_BY,
'**************',
'*******',
'件',
1,
0 STOCK_UP_QTY,
'',
'**','**','**','**',
0 ISDELETE,
0 ISCLOSE,
'2021-01-03'
FROM DUAL) A
总结
对于插入时的字段数必须与插入的字段数一致,目前还没有想到新的解决办法将插入字段与传入参数字段一致。
版权声明:本文为qq_42365066原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。