使用工具:ibatis(目前以集成在MyBatis3.0.1或更高版本中部分3.x.x版本已移除ibatis,本文使用MyBatis3.0.1MyBatis2.5.x同样集成ibatis,但无法使用
支持JDK版本:1.5及以上
import org.apache.ibatis.jdbc.ScriptRunner;
//执行mysql数据库脚本示例
@Test
public void mulitSqlForIbatisOnMySql() {
try {
//执行日志文件配置
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("src/account/mysql/log.txt")), "UTF-8"));
//执行sql语句报错时文件配置
BufferedWriter error = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("src/account/mysql/error.txt")), "UTF-8"));
Class.forName("com.mysql.jdbc.Driver").newInstance();
//获取数据源
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&reConnect=true;","root", "19821982");
//创建脚本执行对象
ScriptRunner r = new ScriptRunner(conn);
//设置日志输出流,将执行日志保存至流中,每次将会覆写
r.setErrorLogWriter(new PrintWriter(error));
//设置错误信息输出,将错误日志保存至流中,每次将会覆写,如果sql脚本无错误运行成功,则该文件内容为空
r.setLogWriter(new PrintWriter(log));
//执行sql脚本,默认位置为classpath,也就是与src文件夹同级
r.runScript(new BufferedReader(new InputStreamReader(new FileInputStream(new File("src/account/newAccount_mysql.sql")), "UTF-8")));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != conn)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(null != log)
try {
log.close();
} catch (IOException e) {
e.printStackTrace();
}
if(null != error)
try {
error.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:在sql脚本中,必须每条语句使用";“分割,否则ScriptRunner
将引发异常;一般使用数据库工具,例如navicat将sqlserver表导出为sql时,可能每行语句使用GO批处理语句结束,则如果需要使用ScriptRunner
对象执行sql脚本,则需要手动将GO批处理语句替换为”;"
例如:
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[user_list]') AND type IN ('U'))
DROP TABLE [dbo].[user_list]
GO
应替换为:
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[user_list]') AND type IN ('U'))
DROP TABLE [dbo].[user_list]
;
使用navicat导出mysql表或数据时,默认使用";"作为sql语句分隔符,不需要进行修改
其他可执行sql脚本的工具:flyway、ant(可自行百度,推荐使用ibatis,简单、易操作)
以下附上mybatis下载链接: