10-批量操作、事务

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中使用Dapper进行事务批量操作,可以按照以下步骤进行: 1. 开启事务:使用Dapper的Transaction属性可以开启事务。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { // 执行批量操作 transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 2. 执行批量操作:使用Dapper的Execute方法可以执行批量操作。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { string sql = "INSERT INTO MyTable (Column1, Column2) VALUES (@Column1, @Column2)"; List<MyData> data = new List<MyData>(); // 添加数据到data列表中 cn.Execute(sql, data, transaction); transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 其中,MyData是一个自定义的数据模型,包含要插入到数据库中的数据。 3. 使用SqlBulkCopy进行批量操作:Dapper也支持使用SqlBulkCopy进行批量操作,可以提高批量操作的效率。 ``` using (var cn = new SqlConnection(connectionString)) { cn.Open(); using (var transaction = cn.BeginTransaction()) { try { using (var bulkCopy = new SqlBulkCopy(cn, SqlBulkCopyOptions.Default, transaction)) { bulkCopy.DestinationTableName = "MyTable"; DataTable table = new DataTable(); // 添加数据到table中 bulkCopy.WriteToServer(table); } transaction.Commit(); } catch { transaction.Rollback(); throw; } } } ``` 以上就是使用Dapper进行事务批量操作的基本步骤。需要注意的是,批量操作可能会影响数据库性能,应该在适当的时候进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值