ibatis无法重新装入批量插入的主键

时间:2014-01-10 07:22:10

标签: mysql spring 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具有响应mysql autoincrement主键的属性id

在我的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());
}

并且在正常情况下,两个对象id应该是mysql中的parimary键,但我发现它始终为null 0

如果我调用非批处理方法,那将是正常的,单数据方法是

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

1 个答案:

答案 0 :(得分:0)

我最近遇到了同样的问题。我只是阅读mybatis代码。这个有助于将实体插入MySQL。但是它有点复杂,因为在mybatis配置文件中注册了ObjectWrapperFactory和TypeHandler。看到 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