当前位置: 首页 > 科技观察

MybatisPlus批量向MySQL插入数据

时间:2023-03-22 15:47:29 科技观察

作为CRUD程序员,大多数Java开发者应该都在使用MybatisPlus来操作数据库。但是BaseMapper默认只提供了intinsert(Tentity)单一的insert方法。那么我们要批量插入数据怎么办呢?之前使用Mybatis的时候,我们会在Mapper.xml中写一个foreach循环:12345678insertintouser(user_name,create_time)values(#{list.userName},now())如果批量有很多实体对象,我们会写很多这样的Mappers。如果表字段很多,工作量也不小。当然,如果你用的是代码生成工具,那就无视我吧。MybatisPlus作为Mybatis的增强版,也为我们考虑到了这个问题。使用MybatisPlus批量插入数据有两种方式。第一个是Service层继承IService,第二个是insertBatchSomeColumn。我们来看看IService创建Mapper的方式。InheritBaseMapperpublicinterfaceUserMapperextendsBaseMapper{}新建一个Service接口,继承IServicepublicinterfaceUserServiceextendsIService{voidbatchAddUser();}新建一个Service实现类,它继承ServiceImplpublicclassUserServiceImplextendsServiceImplimplementsUserService{@AutowiredprivateUserMapperuserMapper;@OverridepublicvoidbatchAddUser(){ListuserDOList=newArrayList<>();UserDOuser1=newUserDO();user1.setAge(99);user1.setName("99_1");userDOList.add(user1);UserDOuser2=newUserDO();user2.setAge(999);user2.setName(“999_1”);userDOList.add(user2);this.saveBatch(userDOList,2);}}这样会生成多条INSERT语句,一条一条执行,然后按照设置的batchSize提交事务。我们来看看insertBatchSomeColumn是怎么做的。1.新建一个InsertBatchInjector类来扩展DefaultSqlInjector123456789@ComponentpublicclassInsertBatchInjectorextendsDefaultSqlInjector{@OverridepublicListgetMethodList(ClassmapperClass,TableInfotableInfo){ListmethodList=super.getpperClass,table(ma);methodList.add(newInsertBatchSomeColumn());返回方法列表;}}2.新建一个Mapper接口,继承BaseMapper并添加insertBatchSomeColumn方法,1234@MapperpublicinterfaceUserMapperextendsBaseMapper{intinsertBatchSomeColumn(ListuserDOList);}3.直接调用Mapper的insertBatchSomeColumn即可在你要批量写入的地方123456789101112publicvoidbatchAddUser(){ListuserDOList=newArrayList<>();UserDOuser1=newUserDO();user1.setAge(99);user1.setName("99_1");userDOList.add(user1);UserDOuser2=newUserDO();user2.setAge(999);用户2.setName("999_1");userDOList.add(user2);userMapper.insertBatchSomeColumn(userDOList);}这个方法拼接成SQL一次性提交到数据库执行。SQL语句的长度受MySQL服务器的max_allowed_pa??cket参数限制,默认为1M。如果拼接的字符串过长,会报错。可以减少批量提交的记录数,或者调整max_allowed_pa??cket参数的大小。innodb_buffer_pool_size的大小除了受max_allowed_pa??cket的影响外,还会影响batchrecords的大小。innodb_buffer_pool_size默认值为128M。我们可以根据情况进行调整,合理配置innodb_buffer_pool_size参数,以提高MySQL的读写性能。

最新推荐
猜你喜欢