Java语言执行SQL脚本文件

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 在程序执行过程中,难免会遇到一些建表等数据库操作如果只有一个操作,可以执行在XML里编写。但是有多个时,就需要像Navicat这种开发工具直接执行SQL文件,在Java里同样也可以。

前言

在程序执行过程中,难免会遇到一些建表等数据库操作

如果只有一个操作,可以执行在XML里编写。但是有多个时,就需要像Navicat这种开发工具直接执行SQL文件,在Java里同样也可以。

主要依赖

MySQL驱动必不可少

执行SQL文件需要用到Mybatis,MP也是可以的

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9

具体操作

1、获取驱动

这里MySQL版本为8.0

public Connection getManagerConnection(String database, String username, String password) throws Exception {
        String url = "jdbc:p6spy:mysql://localhost:3306/"+database+"?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&cachePrepStmts=true&useServerPrepStmts=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8";
        Class.forName("com.mysql.cj.jdbc.Driver");
        return DriverManager.getConnection(url,username,password);
    }
• 1
• 2
• 3
• 4
• 5

2、获取文件

获取File只是为了校验文件,可以不校验,执行调用第五步执行

public String test(){
  String database = "xxx";
  String username = "root";
  String password = "1234";
  // 获取classpath下的sql文件
  ClassPathResource classPathResource = new ClassPathResource("sql/xxx.sql");
  InputStream is = classPathResource.getInputStream();
  InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
  // 直接编写第五步执行就好
  // xxx
  // 获取绝对路径下的sql文件
  String path = "D:\xxx.sql";
  // 调用获取结果
  dataRecovery(path,database,username,password);
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17

3、校验文件并执行返回结果

public String dataRecovery(String filePath, String database, String username, String password) {
    try {
        File file = new File(filePath); // 转换成File对象
        if (!file.exists()) {
            return "该文件不存在"; // 路径错误
        }
        if (file.isFile()){
          // 该路径表示一个文件
            String fileName = file.getName();
            String fileNameLast = fileName.substring(fileName.indexOf("."));
            if (".sql".equals(fileNameLast)){
              // 如果是sql文件执行
                initTable(database,username,password,file);
            } else{
                return "文件格式错误";
            }
        }
        if (file.isDirectory()){
          // 该路径表示一个文件夹
            File f = getFile(file); // 公共方法,下面提供
            if (null == f){
                return "文件格式错误";
            }
            // 如果是sql文件执行
            initTable(database,username,password,f);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "成功";
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23
• 24
• 25
• 26
• 27
• 28
• 29
• 30
• 31

4、文件夹中获取sql文件getFile()

如果想获取多层的,递归就好,我就搞一层。

public File getFile(File file){
    File[] files = file.listFiles();
    for (File f : files) {
        if (f.isFile()) {
            String fileName = f.getName();
            String fileNameLast = fileName.substring(fileName.indexOf("."));
            if (".sql".equals(fileNameLast)){
                return f;
            }
        }
    }
    return null;
}
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13

5、执行SQL文件

public void initTable(String database,String username, String password, File file) throws Exception {
    Connection conn = getManagerConnection(database, username, password);
    FileReader reader = new FileReader(file);
    ScriptRunner scriptRunner = new ScriptRunner(conn);
    // 设置编码,防止中文乱码
    Resources.setCharset(Charset.forName("UTF-8"));
    // 必须为true,不然容易报错
    scriptRunner.setSendFullScript(true);
    // 执行
    scriptRunner.runScript(reader);
    scriptRunner.closeConnection();
    reader.close();
}
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
18天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
81 34
|
3天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
25 9
|
23天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
1月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
38 8
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
42 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
102 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
58 4