业务场景:
离线更新功能:客户端无法连接外网情况下,使用其他可联网设备下载好的sql脚本,上传到客户端服务器并执行SQL文件,从而达到与服务端进行数据同步。
方案:
使用ibatis提供的ScriptRunner对象即可执行sql文件。
步骤:
1.pom文件添加相关jar包依赖
<!-- 利用ibatis的ScriptRunner执行sql文件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
2.测试代码实现如下
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import org.apache.ibatis.jdbc.ScriptRunner;
public class ExecSqlFileController {
public static void execSqlFileByMysql(String ip, String port, String userName, String pwd, String sqlFilePath,
String dbName) throws Exception {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://" + ip + ":" + port + "/" + dbName;
Exception error = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, userName, pwd);
// 设置不自动提交
conn.setAutoCommit(false);
ScriptRunner runner = new ScriptRunner(conn);
// 设置不自动提交
runner.setAutoCommit(false);
/*
* setStopOnError参数作用:遇见错误是否停止;
* (1)false,遇见错误不会停止,会继续执行,会打印异常信息,并不会抛出异常,当前方法无法捕捉异常无法进行回滚操作,无法保证在一个事务内执行;
* (2)true,遇见错误会停止执行,打印并抛出异常,捕捉异常,并进行回滚,保证在一个事务内执行;
*/
runner.setStopOnError(true);
/*
* 按照那种方式执行
* 方式一:true则获取整个脚本并执行;
* 方式二:false则按照自定义的分隔符每行执行;
*/
runner.setSendFullScript(false);
// 定义命令间的分隔符
runner.setDelimiter(";");
runner.setFullLineDelimiter(false);
// 设置是否输出日志,null不输出日志,不设置自动将日志输出到控制台
runner.setLogWriter(null);
// 如果又多个sql文件,可以写多个runner.runScript(xxx),
runner.runScript(new InputStreamReader(new FileInputStream(sqlFilePath), "utf-8"));
conn.commit();
} catch (Exception e) {
conn.rollback();
error = e;
} finally {
close(conn);
}
if (error != null) {
throw error;
}
}
private static void close(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
if (conn != null) {
conn = null;
}
}
}
public static void main(String[] args) {
try {
execSqlFileByMysql("127.0.0.1", "3306", "root", "root",
"D:/save/backup.sql", "db-demo");
} catch (Exception e) {
e.printStackTrace();
}
}
}