@Resource(name = "dataSource")
DruidDataSource dataSource;
//参数替换占位符
@Value("${scriptrun.sql.splitMark}")
String splitMark;
//转义字符
static String[] specalMarks = {"?"};
public IBaseResult runSqlScript(MultipartFile file, String userId, List<String> param) {
if(null == userId || "".equals(userId.trim())){
return DefaultResult.buildFailedResult(RetResultCode.E13002);
}
ByteArrayOutputStream baos = null;
InputStream fis = null;
String script = "";
try {
fis = file.getInputStream();
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
for (int len = 0; (len = fis.read(buffer)) > 0;) {
baos.write(buffer, 0, len);
}
script = new String(baos.toByteArray(),defaultEncode);
} catch (Exception e) {
logger.error(e.getMessage(),e);
} finally {
try {
if(null != baos){
baos.close();
}
if(null != fis){
fis.close();
}
} catch (Exception e2) {
logger.error(e2.getMessage(),e2);
}
}
//String script = fileUtil.getFileContentToString(fileObj);
//替换参数
if(null != param && !param.isEmpty()){
for(int i=0;i<param.size();i++){
int thisMarkIndex = script.indexOf(splitMark);
if(param.contains(splitMark)){
return DefaultResult.buildFailedResult(RetResultCode.E13005);
}
if(thisMarkIndex <= -1){
return DefaultResult.buildFailedResult(RetResultCode.E13003);
}
String changeMark = splitMark;
if(Arrays.asList(specalMarks).contains(splitMark)){
changeMark = "["+splitMark+"]";
}
script = script.replaceFirst(changeMark,param.get(i));
}
}
if(script.indexOf(splitMark) >-1){
return DefaultResult.buildFailedResult(RetResultCode.E13004);
}
DruidPooledConnection conn;
try {
//自行获取数据库连接
conn = dataSource.getConnection();
ScriptRunner runner = new ScriptRunner(conn);// 创建ScriptRunner
runner.setAutoCommit(true);// 自动提交
ByteArrayInputStream stream = new ByteArrayInputStream(script.getBytes());
runner.runScript(new InputStreamReader(stream, defaultEncode));
} catch (SQLException e) {
logger.error(e.getMessage(),e);
return DefaultResult.buildFailedResult(RetResultCode.E14010);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(),e);
return DefaultResult.buildFailedResult(RetResultCode.E14010);
}
return DefaultResult.buildSuccessResult();
}