最近在学习若依这个开源项目: https://gitee.com/y_project/RuoYi-Vue
默认的代码生成模块用起来总感觉别扭,比如说,每次生成的代码还要单独的手动执行一下SQL语句。我就在想能不能代码生成的时候就自己帮我执行好了。这样能省个10几秒时间。
由于若依这个框架默认的数据库操作组件是mybatis,所以本文就来研究一下如何通过mybatis来执行sql脚本。
Service我修改的如下代码: RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
核心代码如下:
package com.ruoyi.generator.service;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
/**
* 业务 服务层实现
*
* @author ruoyi
*/
@Service
public class GenTableServiceImpl implements IGenTableService
{
private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class);
@Autowired
private DataSource dataSource;
/**
* 使用ScriptRunner执行SQL脚本
* @param filePaths 是文件的绝对路径数组,格式如下:
* String[] filePaths = {"/xxx/sql/update1.sql", "/xxx/sql/update2.sql"};
*/
public void doExecuteSql(String[] filePaths) {
//通过数据源获取数据库链接
Connection connection = DataSourceUtils.getConnection(dataSource);
//创建脚本执行器
ScriptRunner scriptRunner = new ScriptRunner(connection);
//创建字符输出流,用于记录SQL执行日志
StringWriter writer = new StringWriter();
PrintWriter print = new PrintWriter(writer);
//设置执行器日志输出
scriptRunner.setLogWriter(print);
//设置执行器错误日志输出
scriptRunner.setErrorLogWriter(print);
//设置读取文件格式
Resources.setCharset(StandardCharsets.UTF_8);
for (String path : filePaths) {
Reader reader = null;
try {
File file = new File(path);
//获取资源文件的字符输入流
if(file.exists()) {
reader = new FileReader(file);
}
} catch (IOException e) {
//文件流获取失败,关闭链接
log.error(e.getMessage(), e);
scriptRunner.closeConnection();
return;
}
//执行SQL脚本
scriptRunner.runScript(reader);
//关闭文件输入流
try {
reader.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
//输出SQL执行日志
log.debug(writer.toString());
//关闭输入流
scriptRunner.closeConnection();
}
}
参考
《spring+mybatis执行SQL脚本文件》 https://blog.csdn.net/Michean/article/details/112651793