1.Service下增加BatchDao类
package com.study.model.service; import java.util.List; public interface BatchDao<T> { public void batchInsert(List<T> list); public void batchUpdate(List<T> list); }
2.Service下增加AbstractDao类
package com.study.model.service; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; public abstract class AbstractDao implements BatchDao { @PersistenceContext protected EntityManager em; @Transactional public void batchInsert(List list) { for (int i = 0; i < list.size(); i++) { em.persist(list.get(i)); if (i % 30 == 0) { em.flush(); em.clear(); } } } @Transactional public void batchUpdate(List list) { for (int i = 0; i < list.size(); i++) { em.merge(list.get(i)); if (i % 30 == 0) { em.flush(); em.clear(); } } } }
3.创建类CategoryServices并extends AbstractDao
package com.study.model.service; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class CategoryServices extends AbstractDao{ public void insert(String platformName){ List<String> list=new ArrayList<String>(); list.set(0,platformName); CategoryServices.super.batchInsert(list); System.out.println("insert start for"+platformName); } public void batchUpdate(String platformName){ List<String> list=new ArrayList<>(); list.set(0,platformName); CategoryServices.super.batchUpdate(list); System.out.println("batchUpdate start for"+platformName); } }
4.创建类CategoryController并增加batchUpdate方法
package com.study.model.controller; import com.study.model.service.CategoryServices; import io.swagger.annotations.ApiOperation; import org.apache.log4j.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping(value = "/category") public class CategoryController { @Autowired private CategoryServices categoryServices; private static final Logger logger= LoggerFactory.getLogger(CategoryController.class); @ApiOperation(value="批量插入品类信息", notes="批量插入品类信息") @RequestMapping(value="/batchUpdate",method = RequestMethod.POST) public int batchUpdate(@RequestBody List<Category> list){ logger.info("batchUpdate-start:"); categoryServices.batchUpdate(list); return 1; } }
5.在对应需要进行事务管理的方法上增加@Transactional注释
package com.study.model.service; import com.study.model.entity.Platform; import com.study.model.repository.PlatformRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.UUID; @Service public class PlatformService { //持久层 @Autowired private PlatformRepository platformRepository; @Autowired private CategoryServices categoryServices; private static final Logger logger= LoggerFactory.getLogger(PlatformService.class); public Platform findByName(String platformName) { return platformRepository.findByName(platformName); } public Platform findUsedByName(String platformName) { return platformRepository.findByNameAndIsDeleted(platformName,false); } public Platform findByNameForBudget(String platformName) { return platformRepository.findByNameForBudget(platformName); } public Page<Platform> findAll(int page, int size){ Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(page, size, sort); return platformRepository.findAll(pageable); } public Page<Platform> findByNameForPage(String platformName, Pageable pageable){ return platformRepository.findByName(platformName,pageable); } @Transactional public int insert(String platformName){ categoryServices.insert(platformName); logger.info("insert-start:"); Platform platform = new Platform(); platform.setId(UUID.randomUUID().toString()); platform.setCode(platformName); platform.setName(platformName); platform.setCreateTime(new Date()); platform.setModifyTime(new Date()); platform.setCreateUser("00000000-0000-0000-0000-000000000001"); platform.setModifyUser("00000000-0000-0000-0000-000000000001"); platform.setOrder(0); platform.setUseForBudget(false); platform.setIsDeleted(false); if(platformRepository.countByName(platformName) > 0){ throw new RuntimeException(); } platformRepository.save(platform); //throw new RuntimeException(); return 1; } }
6.访问:http://localhost:8081/swagger-ui.html,测试调用batchUpdate