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

业务场景:

         离线更新功能:客户端无法连接外网情况下,使用其他可联网设备下载好的sql脚本,上传到客户端服务器并执行SQL文件,从而达到与服务端进行数据同步。

方案:

        使用ibatis提供的ScriptRunner对象即可执行sql文件。

步骤:

1.pom文件添加相关jar包依赖


  
    org.mybatis  
    mybatis  
    3.3.0  
  
  
    mysql  
    mysql-connector-java  
    5.1.36  

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();
        }
    }
}

 

你可能感兴趣的:(数据库同步)