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
