Spring Boot 中批量执行 SQL 脚本的实践

在Spring Boot应用中,有时候我们需要批量执行存储在数据库中的 SQL 脚本。本文将介绍一个实际的案例,演示如何通过 Spring Boot、MyBatis 和数据库来实现这一目标。

0、数据库层

CREATE TABLE batchUpdate (

    id INT AUTO_INCREMENT PRIMARY KEY,
    update_type VARCHAR(255) NOT NULL,
    success_flag BOOLEAN NOT NULL,
    failure_count INT NOT NULL,
    execution_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    sql_script TEXT NOT NULL
);

  


-- 第一条数据

INSERT INTO `batch_update` (`update_type`, `success_flag`, `failure_count`, `update_count`, `sql_script`)

VALUES

('update_type_1', 0, 0, 0,

'UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';

UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';

UPDATE batch_update SET failure_count = failure_count + 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';');

  


-- 第二条数据

INSERT INTO `batch_update` (`update_type`, `success_flag`, `failure_count`, `update_count`, `sql_script`)

VALUES

('update_type_2', 0, 0, 0,

'UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';

UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';

UPDATE batch_update SET failure_count = failure_count + 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';');

  


-- 第三条数据

INSERT INTO `batch_update` (`update_type`, `success_flag`, `failure_count`, `update_count`, `sql_script`)

VALUES

('update_type_1', 0, 0, 0,

'UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';

UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';

UPDATE batch_update SET failure_count = failure_count + 1, update_count = update_count + 1 WHERE update_type = ''update_type_1'';');

  


-- 第四条数据

INSERT INTO `batch_update` (`update_type`, `success_flag`, `failure_count`, `update_count`, `sql_script`)

VALUES

('update_type_2', 0, 0, 0,

'UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';

UPDATE batch_update SET success_flag = 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';

UPDATE batch_update SET failure_count = failure_count + 1, update_count = update_count + 1 WHERE update_type = ''update_type_2'';');

1. 控制器层(Controller)

@RestController
@RequestMapping("/batchUpdate")
@AllArgsConstructor
public class BatchUpdateController {

    private BatchUpdateService batchUpdateService;

    @PostMapping("/executeScript/{updateType}")
    public String executeScript(@PathVariable String updateType) {
        List batchUpdateEntities = batchUpdateService.findByUpdateType(updateType);

        if (batchUpdateEntities.isEmpty()) {
            return "Update type not found.";
        }

        for (BatchUpdateEntity batchUpdateEntity : batchUpdateEntities) {
            batchUpdateService.executeSqlScriptBatch(batchUpdateEntity);
        }

        return "SQL scripts executed successfully.";
    }
}

2. 服务层(Service)

javaCopy code
@Service
@AllArgsConstructor
public class BatchUpdateService {

    private BatchUpdateMapper batchUpdateMapper;

    public List findByUpdateType(String updateType) {
        return batchUpdateMapper.findByUpdateType(updateType);
    }

    public void executeSqlScriptBatch(BatchUpdateEntity batchUpdateEntity) {
        String sqlScript = batchUpdateEntity.getSqlScript();
        List sqlScripts = Arrays.stream(sqlScript.split(";"))
                .map(String::trim)
                .filter(s -> !s.isEmpty())
                .toList();
        System.out.println(sqlScripts.size());
        sqlScripts.forEach(sql -> {
            System.out.println("要执行的sql:" + sql);
            batchUpdateMapper.executeSqlScript(sql);
            System.out.println("已执行的sql:" + sql);
        });
    }
}

3. 数据访问层(Mapper)

@Mapper
public interface BatchUpdateMapper {

    List findByUpdateType(@Param("updateType") String updateType);
    void executeSqlScript(@Param("sql") String sql);
}

4. MyBatis 配置文件(BatchUpdateMapper.xml)





    
        
        
        
        
        
        
    

    
    
        ${sql}
    

Spring Boot 中批量执行 SQL 脚本的实践_第1张图片

Spring Boot 中批量执行 SQL 脚本的实践_第2张图片

通过这个案例,可以学到如何在 Spring Boot 中通过 MyBatis 实现批量执行 SQL 脚本的功能。在控制器层中,我们通过 @PostMapping 注解定义了一个接口,接收 updateType 作为路径参数,然后调用服务层的方法。服务层中,我们通过 MyBatis 执行 SQL 脚本,实现了对数据库的批量操作。

你可能感兴趣的:(#,Java,框架,#,RDBMS,spring,boot,sql)