序言:
? ? ? ? 我們在做項目的時候,經常會遇到,對數據的新增動作,如果數據量很少的情況下,單個新增對性能還好,但是一旦涉及到 大數據量,如十萬,百萬,千萬,這個時候如果采用單個新增,那么整個系統都得癱瘓,響應時間 小時級別了,就可以出門左轉,28路公交,火車站,回老家了。
吐槽:
????????對于項目而言,性能是最重要的,性能的快慢,對客戶的體驗和公司的名譽有著直接關系,要想代碼寫得好,首先圍著性能跑。這幾天一直在搞大數據插入的功能,自己總結了一些經驗,供于各位大佬參考:
1、定時實體
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("Dictionary_Info")
@ApiModel(value="DictionaryInfo對象", description="")
public class DictionaryInfo implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "主鍵ID")@TableId(value = "ID", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "編碼")@TableField("DI_Code")private String diCode;@ApiModelProperty(value = "名稱")@TableField("DI_Name")private String diName;@ApiModelProperty(value = "描述")@TableField("DI_Desc")private String diDesc;@ApiModelProperty(value = "類型")@TableField("DI_Type")private String diType;@ApiModelProperty(value = "是否刪除")@TableField("IsDelete")private Boolean isdelete;@TableField("TS")private Date ts;}
2、定義mapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.walmart.java.sams.api.mapper.OrderplanConfirmMapper"><insert id="insertBs" parameterType="保存數據庫的參數實體">
INSERT INTO Dictionary_Info (DI_Code, DI_Name, DI_Desc, DI_Type, IsDelete, TS) VALUES(#{diCode}, #{diName}, #{diDesc}, #{diType}, #{isDelete, #{ts};</insert>
</mapper>
3、定時一個接口
//服務類
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}
一、MyBatis 集合方式批量新增
1、定義Mapper
@Mapper
public interface DictionaryInfoMapper extends BaseMapper<DictionaryInfo> {//MyBatis以集合方式批量新增void insertBs(DictionaryInfomodel);
}
2、實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入insertBs(dicList);}}
二、MyBatis-Plus提供的SaveBatch方法
1、實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入saveBatch(dicList);}}//服務類
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}
三、MyBatis-Plus? 的 InsertBatchSomeColumn?
1、自定義?BatchPlusSqlInjector 類
public class BatchPlusSqlInjector extends DefaultSqlInjector {@Override//傳入對象,類,反射對象的屬性public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
2、定時項目啟動,加載的核心類
@Configuration
public class MybatisPlusConfig {public BatchPlusSqlInjector sqlInjector() {return new BatchPlusSqlInjector();}
}
3、自定義一個Mapper接口
public interface BatchPlusBaseMapper<T> extends BaseMapper<T> {Integer insertBatchSomeColumn(Collection<T> entityList);
}
4、定義Mapper繼承?BatchPlusBaseMapper
@Mapper
public interface DictionaryInfoMapper<T> extends EasyBaseMapper<DictionaryInfo> {}
實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入baseMapper.insertBatchSomeColumn(dicList )}}