批量插入代码分表

批量插入代码分表

groupingBy分组函数,根据表名分组,为Map格式,然后循环插入,键为表名,值为分到相同表的keywordMeta

public void batchHandleKeywordLabel(List<KeywordMeta> keywordMetas){
        String tabelName = "t_keyword_meta";
        //分表批量处理
        ConvertByStrategyUtil convertByStrategyUtil = new ConvertByStrategyUtil();
        Map<String,List<KeywordMeta>> tableNameMap = keywordMetas.stream()
                .collect(Collectors.groupingBy(keywordMeta -> convertByStrategyUtil
                        .convert(tabelName,keywordMeta.getKeyword(),20,StrategyEnum.NUMBER)));
        for (Map.Entry<String, List<KeywordMeta>> stringListEntry : tableNameMap.entrySet()) {
            batchKeywordMetaMapper.batchInsertKeywordMeta(stringListEntry.getKey(),stringListEntry.getValue());
        }
    }
public class ConvertByStrategyUtil {

    /**
     * 给定keyword返回表名
     * @param tableName 表名
     * @param value keyword
     * @param tableNum 分表数
     * @param strategy 策略
     * @return
     */
    public String convert(String tableName, String value, long tableNum, StrategyEnum strategy) {
        StrategyManager strategyManager = ContextHelper.getStrategyManager();
        IStrategy iStrategy = strategyManager.getStrategy(strategy.getStrategy());
        // 表名
        return iStrategy.convert(tableName, value, tableNum);
    }

    public String convert(TableSplit tableSplit, Object sqlParam, Connection connection) {
        return null;
    }


}
public interface BatchKeywordMetaMapper {
    int batchInsertKeywordMeta(@Param("tableName") String tableName,@Param("keywordMetas")List<KeywordMeta> keywordMetas);
}
<insert id="batchInsertKeywordMeta">
        replace into ${tableName} (meta_id,keyword)
        values
        <foreach collection="keywordMetas" item="item" separator=",">
            (#{item.metaId},#{item.keyword})
        foreach>
    insert>

你可能感兴趣的:(项目中问题及解决,java,开发语言)