springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用

简介: springboot-maven项目+jpa 运行过程中执行resources下sql脚本文件-ClassPathResource和ScriptUtils.executeSqlScript的使用

要完成上述需求,需要分两步操作

  • 获取resources目录下的sql脚本文件
  • 执行该文件

获取resources目录下的sql脚本文件


一般来说,项目的配置文件及静态资源都会放置在resources目录下。如下图


00a73497fb0d4cac9bc760c8d04911f4.png

当需要在java代码中使用resources目录下的文件时,就需要先获取该文件了

以获取上图test.sql文件为例,方法有二


方法一:

//这种方法在linux下无法工作
File sourceFile = ResourceUtils.getFile("classpath:db/test.sql");


⚠️:这种方法在linux下无法工作,我未采用

方法二:

我使用的是第二种。


import org.springframework.core.io.Resource;
// ... 忽略部分代码
Resource resource = new ClassPathResource("db/test.sql");
//获取到resource对象后,可以调用resouce.getFile()方法来获取文件。
File sourceFile = resource.getFile();

通过Resouce的实现类ClassPathResource来new一个对象。

该构造方法的参数是resources目录下的文件路径,注意这里是使用的相对路径(相对于resouces目录而言的)


尝试使用但未成功的方法


//通过入参相对路径或绝对路径都没有获取成功
Class.getResource("")获取相对于当前类的相对路径
Class.getResource("/")获取classpath的根路径
ClassLoader.getResource("")获取classpath的根路径


执行该sql文件


使用 Spring 提供的工具类执行 sql 文件


我是通过jpa来简化对数据库的操作,所以采用了Spring的工具类;如果用的是mybatis,可以直接跳过看下面

import javax.sql.DataSource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
// ... 忽略部分代码
DataSource dataSource = createDataSource();  
Resource resource = new ClassPathResource("db/test.sql");
ScriptUtils.executeSqlScript(dataSource.getConnection(), resource);

使用mybatis方式执行 sql 文件

使用的是mybatis的ScriptRunner方法

直接上代码


/**
 * 使用ScriptRunner执行sql文件
 */
public class ExecuteSql {
    @Autowired
    private DataSource dataSource; // 获取数据库连接对象
    public static void main(String[] args) {
        try {
            executeSqlFile("db/test.sql");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void executeSqlFile(String sqlFileName) throws Exception {
        // 获取连接对象
        Connection conn = dataSource.getConnection();
        //或者直接指明数据库
        //Class.forName(className);
        //Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
        try {
            // 设置不自动提交
            conn.setAutoCommit(false);
            // 初始化ScriptRunner
            ScriptRunner runner = new ScriptRunner(conn);
            // 设置不自动提交
            runner.setAutoCommit(false);
            // true,遇见错误会停止执行,打印并抛出异常,捕捉异常,并进行回滚,保证在一个事务内执行;
            // false,遇见错误不会停止,会继续执行,会打印异常信息,并不会抛出异常,当前方法无法捕捉异常无法进行回滚操作,无法保证在一个事务内执行;
            runner.setStopOnError(true);
            // true则获取整个脚本并执行;
            // false则按照自定义的分隔符每行执行;
            runner.setSendFullScript(false);
            // 定义命令间的分隔符
            runner.setDelimiter(";");
            runner.setFullLineDelimiter(false);
            // 设置是否输出日志,null不输出日志,不设置自动将日志输出到控制台
            runner.setLogWriter(null);
            // 读取文件
            Resource resource = new ClassPathResource(sqlFileName);
            File file = resource.getFile();
            // 如果有多个sql文件,可以写多个runner.runScript(xxx),
            runner.runScript(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
            // 执行
            conn.commit();
        } catch (Exception e) {
            conn.rollback();
            e.printStackTrace();
        } finally {
            conn.close();
        }
    }
}


jpa方式完整代码


import javax.sql.DataSource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
// 获取连接对象
DataSource dataSource = createDataSource().getConnection();
//也可以下面这种方式直接指明
//Class.forName(className);
//Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
Resource resource = new ClassPathResource("db/test.sql");
ScriptUtils.executeSqlScript(conn, resource);
//去检查数据库验证吧!


如果成功了,那么下面就不用看了


其他问题

找不到脚本文件

报错


看到有情况是按照上述jpa方式执行了代码,但是仍然有类似找不到文件的报错

如:

java.io.FileNotFoundException: class path resource [db/test.sql] cannot be resolved to URL because it does not exist
     at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:195)

分析


ClassPathResource方法是到 classPath* 下去找,然后在项目本地的目录下找classPath下是否有这个文件(maven的classPath在 “target\classes”目录下)


解决


可以检查下pom.xml文件,

可能是springboot的maven默认只加载了classPath同级目录下的文件,想要加载其他文件可以使用配置标签

如下:


<build>
  <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
        //相对路径
          <include>**/*.sql</include>
        </includes>
      </resource>
  </resources>
</build>


目录
相关文章
|
2月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
101 0
|
9天前
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
|
2月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
112 4
|
2月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
111 2
|
2月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
120 0
|
1月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
154 1
|
2月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
206 7
|
1月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
143 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!