解决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日

相关文章

  • win10计算器命令怎么打开?win10计算器命令打开方法

    在Windows 10中,可以使用命令行方式打开计算器,下面是打开计算器的几种不同的方式: 使用Win+R命令打开计算器 Win+R是Windows操作系统中打开运行窗口的快捷键组合,可以在其中输入命令来运行程序。在运行窗口中输入”calc”即可打开计算器。 具体步骤如下: 按下Win+R组合键,打开运行窗口; 在运行窗口中输入”calc”; 按下回车键,打…

    other 2023年6月26日
    00
  • gnugrub

    GNU GRUB是一款常用的开源引导加载程序,可以帮助您在启动时选择要启动的操作系统或内核。以下是GNU GRUB的完整攻略: 步骤1:安装GNU GRUB 首先,您需要安装GNU GRUB。您可以按照以下步骤安装: 打开终端。 输入以下命令以安装GNU GRUB: bash sudo apt-get install grub2 等待安装完成。 步骤2:配置…

    other 2023年5月6日
    00
  • xp系统电脑不能关机总是反复多次重启的故障原因及解决方法

    标题:XP系统电脑不能关机总是反复多次重启的故障原因及解决方法 故障原因:XP系统电脑不能关机总是反复多次重启,通常是由于系统的故障或软件冲突引起。可能存在的原因包括: 系统文件损坏,导致系统不能正常关机; 病毒或恶意软件感染,干扰了正常的关机操作; 硬件故障,如电源等硬件出现问题; 一些正在运行的程序或进程,阻止了系统正常关机; 一些错误的系统设置,导致了…

    other 2023年6月27日
    00
  • System.getProperty(user.dir)定位问题解析

    下面我将详细讲解如何使用System.getProperty(user.dir)来定位问题的解析。 什么是System.getProperty(user.dir) 在Java中可以通过调用System类中的静态方法getProperty()来获取系统属性,其中user.dir可以用来获取当前用户的工作目录路径。用户的工作目录路径指的是JVM当前所在的目录,这…

    other 2023年6月27日
    00
  • github上排名前100的android开源库介绍

    以下是详细讲解“GitHub上排名前100的Android开源库介绍”的完整攻略,过程中至少包含两条示例说明的标准Markdown格式文本: GitHub上排名前100的Android开源库介绍 GitHub是全球最大的开源社区,其中包含了大量的Android开源库。本文将介绍GitHub上排名前100的Android开源库,以及它们的主要功能和用途。 1.…

    other 2023年5月10日
    00
  • 实验十一 团队作业7—团队项目设计完善&编码测试

    实验十一 团队作业7—团队项目设计完善&编码测试的完整攻略 在团队项目开发中,设计完善和编码测试是非常重要的环节。本文将详细介绍团队项目设计完善和编码测试的完整攻略,并提供两个示例说明。 团队项目设计完善的攻略 团队项目设计完善的攻略包括以下步骤: 确定项目需求和目标,明确项目的功能和特性。 制定项目计划和进度表,明确项目的时间和资源限制。 设计…

    other 2023年5月5日
    00
  • Win11正式版发现新问题:不兼容注册表中带有非 ASCII 字符的应用程序

    下面是关于“Win11正式版发现新问题:不兼容注册表中带有非 ASCII 字符的应用程序”这个问题的详细讲解的攻略: 问题简介 Windows 11 正式版在最近的更新中,发现不兼容带有非 ASCII 字符的应用程序。这是因为在新版的操作系统中,注册表默认采用 UTF-16 编码,而之前的一些应用程序使用的是其他编码方式,如 GBK、GB2312、BIG5 …

    other 2023年6月25日
    00
  • 不允许有重复的“row.names”

    当我们在R语言中使用read.table()或read.csv()等函数读取数据时,如果数据中有重复的行名(row.names),则会出现“不允许有重复的row.names”错误。以下是解决这个问题的完整攻略: 1. 查看数据中有重复的行名 首先,我们需要查看数据中是否有重复的行名。可以使用以下代码: data <- read.table("…

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