java利用ibatis的ScriptRunner执行sql文件

来源:互联网 发布:java九大排序算法 编辑:程序博客网 时间:2024/05/19 19:58

1.maven引入相应jar包:

<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.使用实例如下:

package test;import java.io.FileInputStream;import java.io.InputStreamReader;import java.sql.Connection;import java.sql.DriverManager;import org.apache.ibatis.jdbc.ScriptRunner;import org.apache.log4j.Logger;/* * 当前设置能够保证文件的sql在同一个事务内执行,如果需要改变为错误仍然继续执行, * 只需修改参数: * conn.setAutoCommit(false);//改为true * runner.setAutoCommit(false);//该为true * runner.setStopOnError(true);//修改为false */public class ScriptRunnerExecSql {    private static Logger LOG = Logger.getLogger(ScriptRunnerExecSql.class.getName());    /**     *     * @Title: execSqlFileByMysql    * @Description: TODO()    * @return void    返回类型    * @param ip    * @param port    * @param userName    * @param pwd    * @param sqlFilePath    * @param dbName    * @throws Exception     */    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();            LOG.error("执行sql文件进行数据库创建失败....", e);            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("192.168.2.23", "3306", "root", "root",                    "C:\\Users\\Administrator\\Desktop\\business_collaboration.sql", "business_collaboration");        } catch (Exception e) {            e.printStackTrace();        }    }}