2017-05-30 33 views
0

我有一個使用Oracle DB和Apache mybatis在Weblogic 12c下運行的Java應用程序。在mybatis中插入值列表

對於單個插入我使用這個映射:

<resultMap id="DataQualityCRUDPlainResultMap" type="de.vkd.niswrapper.model.persistence.DataQualityCRUD">               
    <id  column="ID"     property="id"    jdbcType="DECIMAL" /> 
    <result column="REGION"    property="region"   jdbcType="DECIMAL" /> 
    <result column="ONB_NUM"    property="onbNum"   jdbcType="DECIMAL" /> 
    <result column="ASB_NUM"    property="asbNum"   jdbcType="DECIMAL" /> 
    <result column="FIBERNODES_TOTAL" property="fiberNodesTotal" jdbcType="DECIMAL" /> 
    <result column="FIBERNODES_COUNT" property="fiberNodesCount" jdbcType="DECIMAL" />  
    <result column="FIBERROUTE_TOTAL_COUNT"  property="fiberrouteTotalCount"  jdbcType="DECIMAL" /> 
    <result column="FIBERROUTE_LONGITUDE"   property="fiberrouteLongitude"  jdbcType="DECIMAL" /> 
    <result column="FIBERROUTE_TOTAL_COUNT_USED" property="fiberrouteTotalCountUsed" jdbcType="DECIMAL" /> 
    <result column="FIBERROUTE_LONGITUDE_USED" property="fiberrouteLongitudeUsed" jdbcType="DECIMAL" />  
    <result column="DT_CREATION"   property="dtCreation"  jdbcType="TIMESTAMP" /> 
</resultMap> 

<sql id="cols"> 
    ${alias}ID,  
    ${alias}REGION, 
    ${alias}ONB_NUM, 
    ${alias}ASB_NUM, 
    ${alias}FIBERNODES_COUNT, 
    ${alias}FIBERNODES_TOTAL,  
    ${alias}FIBERROUTE_TOTAL_COUNT, 
    ${alias}FIBERROUTE_LONGITUDE, 
    ${alias}FIBERROUTE_TOTAL_COUNT_USED, 
    ${alias}FIBERROUTE_LONGITUDE_USED,     
    ${alias}DT_CREATION 
</sql> 

<insert id="insert" parameterType="de.vkd.niswrapper.model.persistence.DataQualityCRUD"> 
INSERT INTO NW_NIS_DATA_QUALITY (
<include refid="cols"> 
    <property name="alias" value="" /> 
</include> 
) 
VALUES ( 
    #{id}, 
    #{region}, 
    #{onbNum}, 
    #{asbNum}, 
    #{fiberNodesTotal}, 
    #{fiberNodesCount},   
    #{fiberrouteTotalCount}, 
    #{fiberrouteLongitude}, 
    #{fiberrouteTotalCountUsed}, 
    #{fiberrouteLongitudeUsed},        
    #{dtCreation, jdbcType=TIMESTAMP} 
) 
</insert> 

從Java中我做了以下內容:

for (final DataQuality aDQ : aDQList) { 
    DataQualityCRUD myDDQCrud = new DataQualityCRUD();   
    fillFields(aRegion, now, aDQ, myDDQCrud);                   dataQualityCRUDMapper.insert(myDDQCrud);        
} 

這是工作,但它是不是最佳的。

我想消除循環中的insert並執行值列表的insert

爲了實現這一點,我做了以下內容:

Map<String, Object> map = new HashMap<String, Object>();     
    for (final DataQuality aDQ : aDQList) { 
     DataQualityCRUD myDDQCrud = new DataQualityCRUD();   
     fillFields(aRegion, now, aDQ, myDDQCrud);           
     resultList.add(myDDQCrud);    
    } 
    map.put("list", resultList); 
    dataQualityCRUDMapper.insertAll(map); 

我已經添加到我的MapperinsertAll規格如下:

<insert id="insertAll" parameterType="java.util.Map"> 
    INSERT INTO NW_NIS_DATA_QUALITY (
     <include refid="cols"> 
     <property name="alias" value="" /> 
    </include> 
    ) VALUES 
    <foreach collection="list" item ="element" open = "(" separator="),(" close=")">    
     #{element.id}, 
     #{element.region}, 
     #{element.onbNum}, 
     #{element.asbNum}, 
     #{element.fiberNodesTotal}, 
     #{element.fiberNodesCount},   
     #{element.fiberrouteTotalCount}, 
     #{element.fiberrouteLongitude}, 
     #{element.fiberrouteTotalCountUsed}, 
     #{element.fiberrouteLongitudeUsed},        
     #{element.dtCreation, jdbcType=TIMESTAMP}  
    </foreach> 
</insert> 

不幸的是,這是產生一個異常如下(我我不明白):

### Error updating database. Cause: java.sql.SQLSyntaxErrorException: 
ORA-00933: SQL command not properly ended ### The error may involve 
de.vkd.niswrapper.adapter.gis.mapping.DataQualityCRUDMapper.insertAll- 
Inline ### The error occurred while setting parameters ### SQL: INSERT 
INTO NW_NIS_DATA_QUALITY (ID, REGION, ONB_NUM, ASB_NUM, FIBERNODES_COUNT, 
FIBERNODES_TOTAL, FIBERROUTE_TOTAL_COUNT, 
FIBERROUTE_LONGITUDE, FIBERROUTE_TOTAL_COUNT_USED, 
FIBERROUTE_LONGITUDE_USED, DT_CREATION) 
VALUES 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

### Cause: java.sql.SQLSyntaxErrorException: 
ORA-00933: SQL command not properly ended ; bad SQL grammar []; 
nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: 
SQL command not properly ended 

任何嗨NT?

回答

1

Oracle DB不支持多行插入。 (至少不要在9i之前,而不是您嘗試的語法。)

有關替代語法,請參閱this question