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 }

 

posted @ 2024-03-28 10:04  Se7end  阅读(189)  评论(0编辑  收藏  举报