ibatis не может повторно ввести первичный ключ для пакетной вставки

В моем проекте мы используем фреймворк springmvc, spring и ibatis, проблема в следующем: в моем дао-коде:

@Override
public Integer insertAdzoneEnvInfoBatch(List<AdzoneEnvInfoDO> adzoneEnvInfoList) {
    return executeInsertBatch("AdzoneEnvInfoDAO.insertAdzoneEnvInfo",adzoneEnvInfoList);
}

public Integer executeInsertBatch(final String sqlID, final List stList) {
    Integer result = new Integer(-1);

    if ((sqlID != null) && (stList != null) && !stList.isEmpty()) {
        result = (Integer) getSqlMapClientTemplate().execute(
                new SqlMapClientCallback() {
                    public Object doInSqlMapClient(SqlMapExecutor executor)
                            throws SQLException {
                        Integer result = new Integer(-1);
                        executor.startBatch();

                        for (int i = 0; i < stList.size(); i++) {
                            executor.insert(sqlID, stList.get(i));
                        }

                        result = new Integer(executor.executeBatch());

                        return result;
                    }
                });
    }

    return result;
}

в моем файле sqlmap, sql

<insert id="AdzoneEnvInfoDAO.insertAdzoneEnvInfo" parameterClass="adzoneEnvInfo">
   insert into c_adzone_env_info(
        url,adzoneid,pid,total_screen,screen_no,snapshot,adzone_num,ali_adzone_num,same_screen_num,same_screen_ali_num,
        covered,ad_link,ad_snapshot,adzone_owner,
        adzone_style,adzone_size,date_time,create_time,update_time
        )
        values(
             #url#,#adzoneid#,#pid#,#totalScreen#,#screenNo#,#snapshot#,#adzoneNum#,#aliAdzoneNum#,
            #sameScreenNum#,#sameScreenAliNum#,#covered#,#adLink#,#adSnapshot#,#adzoneOwner#,
            #adzoneStyle#,#adzoneSize#,#dateTime# , now() , now()
        )
    <selectKey resultClass="long" keyProperty="id" type="post">
        SELECT last_insert_id() as ID from c_adzone_env_info limit 1
    </selectKey>
</insert>

и у dataobject есть свойство id, отвечающее на первичный ключ автоинкремента my sql

в моем unittest код

@Test
public void test(){
    AdzoneEnvInfoDO adzoneEnvInfoDO = new AdzoneEnvInfoDO();
    adzoneEnvInfoDO.setAdLink("adlink");
    adzoneEnvInfoDO.setAdSnapshot("adsnapshot");
    adzoneEnvInfoDO.setAdzoneid(99999999L);
    adzoneEnvInfoDO.setAdzoneNum(434);
    adzoneEnvInfoDO.setAdzoneOwner(11);
    adzoneEnvInfoDO.setAdzoneSize("232下232");
    adzoneEnvInfoDO.setAdzoneStyle(2);
    adzoneEnvInfoDO.setAliAdzoneNum(334);
    adzoneEnvInfoDO.setCovered(33);
    adzoneEnvInfoDO.setUrl("sds");
    adzoneEnvInfoDO.setUrlId(232323L);
    adzoneEnvInfoDO.setTotalScreen(32423);


    AdzoneEnvInfoDO adzoneEnvInfoDO1 = new AdzoneEnvInfoDO();
    adzoneEnvInfoDO1.setAdLink("adlink");
    adzoneEnvInfoDO1.setAdSnapshot("adsnapshot");
    adzoneEnvInfoDO1.setAdzoneid(99999999L);
    adzoneEnvInfoDO1.setAdzoneNum(434);
    adzoneEnvInfoDO1.setAdzoneOwner(12);
    adzoneEnvInfoDO1.setAdzoneSize("232下232");
    adzoneEnvInfoDO1.setAdzoneStyle(22);
    adzoneEnvInfoDO1.setAliAdzoneNum(334);
    adzoneEnvInfoDO1.setCovered(33);
    adzoneEnvInfoDO1.setUrl("sds");
    adzoneEnvInfoDO1.setUrlId(232323L);
    adzoneEnvInfoDO1.setTotalScreen(32423);

    adzoneEnvInfoDAO.insertAdzoneEnvInfoBatch(Arrays.asList(adzoneEnvInfoDO, adzoneEnvInfoDO1));

    System.out.println(adzoneEnvInfoDO.getId());
    System.out.println(adzoneEnvInfoDO1.getId());
}

и в норме, два идентификатора объекта должны быть ключом parimary в MySQL, но я обнаружил, что это всегда ноль 0

и если я вызову не пакетный метод, это будет нормально, единственный метод данных

public Long insertAdzoneEnvInfo(AdzoneEnvInfoDO adzoneEnvInfo) {
    return (Long)executeInsert("AdzoneEnvInfoDAO.insertAdzoneEnvInfo",adzoneEnvInfo);
}

1 ответ

У меня та же проблема, что и у вас недавно. Я просто читаю вокруг кодов mybatis. Это полезно для вставки сущностей в MySQL. Однако это немного сложно, потому что ObjectWrapperFactory и TypeHandler зарегистрированы в конфигурационном файле mybatis. См. https://github.com/jactive/java/tree/master/test/mybatis-demo и точку входа https://github.com/jactive/java/blob/master/test/mybatis-demo/java/com/jactive/mybatis/DaoTest.java

Другие вопросы по тегам