解决SpringBoot application.yaml文件配置schema 无法执行sql问题

在 SpringBoot 中我们通常会使用 application.yaml 或 application.properties 作为项目的配置文件,其中可以配置数据源信息、SQL 语句等信息。但是在实际使用中,有些同学会遇到一些问题,比如 application.yaml 中配置 SQL 语句无法执行的问题。下面我将分享一下解决这个问题的攻略:

问题原因

在 application.yaml 中配置的 SQL 语句没有指定对应的 schema,因此无法执行。

解决方案

方案一:使用完整的 SQL 语句

在 YAML 中使用完整的 SQL 语句来解决这个问题,即在 SQL 语句中指定对应的 schema。

例如,我们在 application.yml 中配置以下 SQL 语句:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
    username: root
    password: 123456
    schema: test
  sql:
    init:
      mode: always
      schema-locations: classpath*:sql/*.sql

我们可以将 SQL 语句修改为以下形式:

SELECT * FROM test.user;

这样就指定了执行该 SQL 语句的 schema 为 test,我们就可以正常执行 SQL 语句了。

方案二:在 application.yaml 中指定默认 schema

如果你不想在 SQL 语句中指定 schema,可以在 application.yaml 中指定默认 schema。

例如,在上面的例子中,我们可以在 application.yaml 中添加以下的配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
    username: root
    password: 123456
    schema: test

这样,Spring Boot 就会默认使用 test 作为该数据源的 schema。

示例说明

示例一

有一个数据库名为 db_test,包含两个表:t_user 和 t_order,我们需要执行 t_user 表的查询操作。我们在 application.yaml 中配置了以下数据源信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_test
    username: root
    password: 123456

我们在 service 层使用 JdbcTemplate 执行 SQL 语句,代码如下:

@Autowired
private JdbcTemplate jdbcTemplate;

public void getUserList() {
    List<Map<String, Object>> userList = jdbcTemplate.queryForList("SELECT * FROM t_user");
    userList.forEach(System.out::println);
}

执行 getUserList 方法时,会抛出以下异常:

Caused by: java.sql.SQLSyntaxErrorException: Table 'db_test.t_user' doesn't exist

这是因为在 SQL 语句中没有指定对应的 schema,导致无法找到 t_user 表。要解决这个问题,我们可以在 SQL 语句中指定 schema,如下所示:

List<Map<String, Object>> userList = jdbcTemplate.queryForList("SELECT * FROM db_test.t_user");

或者也可以在 application.yaml 中指定默认 schema,如下所示:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_test
    username: root
    password: 123456
    # 指定默认 schema
    schema: db_test

这样就可以正常执行 SQL 语句了。

示例二

假设我们需要在启动时执行一个 SQL 文件,创建用户表并插入数据。我们在 application.yaml 中添加以下配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_test
    username: root
    password: 123456
    # 指定默认 schema
    schema: db_test
  sql:
    init:
      mode: always
      schema-locations: classpath*:sql/*.sql

在 resources 目录下新建一个 sql 目录,新建一个 user.sql 文件,并在其中编写创建用户表和插入数据的 SQL 语句,如下所示:

DROP TABLE IF EXISTS `User`;
CREATE TABLE `User`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `User` VALUES (1, 'Lucy');

代码中,我们使用 schema-locations 指定了 SQL 文件的路径,其中 classpath*: 表示在 classpath 下查找文件,如果有多个文件,用逗号分隔。

启动项目后,会自动执行指定的 SQL 文件,并创建用户表并插入数据。在 controller 中查询该用户的代码如下:

@Autowired
private JdbcTemplate jdbcTemplate;

@RequestMapping("/getUser")
public String getUser() {
    List<Map<String, Object>> userList = jdbcTemplate.queryForList("SELECT * FROM User");
    return userList.toString();
}

其中,我们在 SQL 语句中没有指定 schema,因为在 application.yaml 中已经指定了默认 schema。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决SpringBoot application.yaml文件配置schema 无法执行sql问题 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 解决无法连接到recaptcha服务

    以下是“解决无法连接到reCAPTCHA服务”的完整攻略: 解决无法连接到reCAPTCHA服务 reCAPTCHA是一种用于防止机器人攻击的Google服务。如果您在使用reCAPTCHA时遇了无法连接到reCAPTCHA服务的问题,本攻略将为您提供一些解决方案。 步骤1:检查网络连接 首先,您需要检查您的网络连接是否正常。如果您的网络连接不稳定或中断,您…

    other 2023年5月7日
    00
  • ubuntu16.04下vim的安装与配置

    Ubuntu 16.04 下 Vim 的安装与配置 1. 安装 Vim 在 Ubuntu 16.04 中,Vim 可以通过 apt 安装。 sudo apt update sudo apt install vim 安装完成后,可以通过以下命令查看 Vim 版本以确认安装是否成功。 vim –version 2. 配置 Vim 2.1 配置文件 Vim 的配…

    其他 2023年3月28日
    00
  • Go语言的GOPATH与工作目录详解

    以下是使用标准的Markdown格式文本,详细讲解Go语言的GOPATH与工作目录的作用和使用方法的完整攻略: GOPATH的作用和配置 GOPATH是Go语言的工作空间,用于存放Go项目的源代码和相关依赖包。 在配置GOPATH之前,需要先创建一个目录作为工作空间,例如:mkdir ~/go。 配置GOPATH的方法有两种: 临时配置:在终端中执行expo…

    other 2023年10月14日
    00
  • USB小白学习之路(2)端点IN/OUT互换

    USB小白学习之路(2)端点IN/OUT互换 USB是一种常见的计算机外设连接标准,它具有支持热插拔和高带宽的特点。在USB通信中,设备和主机之间的通信可以通过端点(Endpoint)来实现。端点是USB通信的基本单位,它包括输入端点(IN Endpoint)和输出端点(OUT Endpoint)两种。本文将介绍端点的基本概念以及如何在代码中进行端点IN/O…

    其他 2023年3月28日
    00
  • Win8.1怎么彻底关闭应用程序具体该如何操作

    当用户在Windows 8.1电脑上关闭应用程序时,它们通常仍然在后台运行,消耗计算机内存和CPU资源。在这种情况下,彻底关闭应用程序可能会对计算机性能产生积极影响。以下是Win8.1怎么彻底关闭应用程序的具体步骤: 步骤1 – 使用任务管理器关闭应用程序 1.按下键盘上的“Ctrl”、“Shift”、“Esc”三个键,打开任务管理器。2.在任务管理器中点击…

    other 2023年6月25日
    00
  • 详细SpringBoot生命周期接口的使用

    完整攻略:详细SpringBoot生命周期接口的使用 介绍 Spring Boot 是一个基于Spring Framework的全栈开发框架,具有快速开发、微服务、易于扩展等特点。Spring Boot的生命周期是指在应用程序运行期间框架为我们提供的用于管理应用程序行为的一组接口。这个生命周期分为多个阶段,其中的各个控制器可以让我们在特定时间点在应用程序的运…

    other 2023年6月27日
    00
  • iOS8.2 beta5固件下载 iOS8.2 beta5官方固件下载地址汇总(需开发者账号)

    首先,什么是iOS 8.2 beta5固件? iOS 8.2 beta5固件是苹果公司针对iOS 8.2系统进行测试和开发的版本。它包含了一些新特性和功能,以及一些修复和改进,但这并不是最终版本,所以需要开发者账号才能下载安装。如果你是开发者,那么就可以通过以下步骤来下载和安装iOS 8.2 beta5固件。 开发者账号申请 在下载iOS 8.2 beta5…

    other 2023年6月26日
    00
  • Java中抽象类与方法的重写方式

    Java中的抽象类和方法是一个重要的概念。抽象类是不能被实例化的类,它主要被用来定义抽象方法和常量。抽象方法是没有方法体的方法,它的实现由派生类来完成。在Java中,子类可以继承抽象类,并实现其中的抽象方法。接下来我们详细讲解Java中抽象类与方法的重写方式。 抽象类的定义 抽象类是用关键字“abstract”定义的类,它包含抽象方法的定义。抽象类无法被实例…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部