使用java代码执行sql文件进行数据同步

业务场景:

         离线更新功能:客户端无法连接外网情况下,使用其他可联网设备下载好的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();
        }
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值