Java使用JDBC执行SQL脚本文件
Java使用JDBC执行SQL脚本文件
代码如下
1 package com.common.core.datasource; 2 3 import cn.hutool.core.io.IoUtil; 4 import cn.hutool.core.util.ArrayUtil; 5 import com.fthj.fba.common.core.GlobalException; 6 import lombok.Data; 7 import lombok.SneakyThrows; 8 import lombok.extern.slf4j.Slf4j; 9 import org.apache.ibatis.io.Resources; 10 import org.apache.ibatis.jdbc.ScriptRunner; 11 import org.junit.jupiter.api.Test; 12 import org.springframework.jdbc.support.JdbcUtils; 13 14 import java.io.File; 15 import java.io.FileNotFoundException; 16 import java.io.FileReader; 17 import java.net.URL; 18 import java.nio.charset.StandardCharsets; 19 import java.sql.Connection; 20 import java.sql.DriverManager; 21 import java.sql.PreparedStatement; 22 import java.sql.ResultSet; 23 24 @Slf4j 25 public class DataSourceUtilTest2 { 26 27 public void loadDriverClass(String driverClassName) { 28 try { 29 Class.forName(driverClassName); 30 } catch (Exception e) { 31 log.error("加载数据源驱动失败,错误信息:{},详情见日志", e.getMessage(), e); 32 throw new GlobalException("加载数据源驱动失败"); 33 } 34 } 35 36 public Connection getConnection(DataSourceProperty properties) { 37 Connection connection; 38 loadDriverClass(properties.getDriverClassName()); 39 try { 40 // 3秒后连接超时 41 DriverManager.setLoginTimeout(3); 42 connection = DriverManager.getConnection(properties.getUrl(), properties.getUsername(), 43 properties.getPassword()); 44 } catch (Exception e) { 45 log.error("数据源连接超时,错误信息:{},详情见日志", e.getMessage(), e); 46 throw new GlobalException("数据源连接超时"); 47 } 48 return connection; 49 } 50 51 @SneakyThrows 52 public boolean validConn(DataSourceProperty properties) { 53 long st = System.currentTimeMillis(); 54 Connection connection = getConnection(properties); 55 PreparedStatement ps = null; 56 try { 57 ps = connection.prepareStatement("SELECT 1"); 58 ResultSet rs = ps.executeQuery(); 59 String result = ""; 60 while (rs.next()) { 61 result = rs.getString(1); 62 } 63 if (!"1".equals(result)) { 64 throw new GlobalException("数据库检查失败"); 65 } 66 return true; 67 } finally { 68 JdbcUtils.closeConnection(connection); 69 JdbcUtils.closeStatement(ps); 70 long t = System.currentTimeMillis() - st; 71 log.info("数据库连接检查耗时:{}", t); 72 } 73 } 74 75 76 public void runnerScript(DataSourceProperty properties, File file) { 77 Connection connection = getConnection(properties); 78 try { 79 if (file.isDirectory()) { 80 File[] files = file.listFiles(); 81 if (ArrayUtil.isNotEmpty(files)) { 82 for (File script : files) { 83 runnerScript(connection, script); 84 } 85 } 86 } else { 87 runnerScript(connection, file); 88 } 89 } catch (Exception e) { 90 throw new GlobalException("执行脚本失败:" + e.getMessage()); 91 } finally { 92 JdbcUtils.closeConnection(connection); 93 } 94 } 95 96 public void runnerScript(Connection connection, File file) throws FileNotFoundException { 97 FileReader reader = null; 98 try { 99 reader = new FileReader(file); 100 ScriptRunner scriptRunner = new ScriptRunner(connection); 101 // 设置编码,防止中文乱码 102 Resources.setCharset(StandardCharsets.UTF_8); 103 // 必须为true,不然容易报错 104 scriptRunner.setSendFullScript(true); 105 // 执行 106 scriptRunner.runScript(reader); 107 } finally { 108 IoUtil.close(reader); 109 } 110 } 111 112 @Test 113 public void testRunnerScript() { 114 DataSourceProperty property = new DataSourceProperty(); 115 property.setDriverClassName("com.mysql.cj.jdbc.Driver"); 116 property.setUrl("jdbc:mysql://xxxx:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"); 117 property.setUsername("root"); 118 property.setPassword("123456"); 119 URL resource = DataSourceUtilTest.class.getClassLoader().getResource("sql_scripts"); 120 if (null != resource) { 121 File file = new File(resource.getPath()); 122 runnerScript(property, file); 123 } 124 } 125 126 @Data 127 public static class DataSourceProperty { 128 private String driverClassName; 129 private String url; 130 private String username; 131 private String password; 132 } 133 }
作者:Se7end
声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。