Java语言执行SQL脚本文件

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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();
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
14天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
36 2
|
16天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
34 4
|
23天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
24天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
34 4
|
27天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
26天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
SQL 存储 Shell
SQL扫描并执行文件夹里的sql脚本
原文:SQL扫描并执行文件夹里的sql脚本 场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存         储过程执行一次。
1029 0
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
115 13
下一篇
无影云桌面