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

相关文章

  • Python静态Web服务器面向对象处理客户端请求

    Python静态Web服务器面向对象处理客户端请求可以分为以下几个步骤: 编写基本的HTTP服务器框架 处理静态资源请求 处理客户端POST请求 使用面向对象的方式重构代码 具体的步骤和示例说明如下: 1. 编写基本的HTTP服务器框架 在编写HTTP服务器框架时,我们需要使用Python中的标准库socket来创建TCP Socket服务器,并监听来自客户…

    other 2023年6月27日
    00
  • C++ 初始化列表详解及实例代码

    C++ 初始化列表详解及实例代码 在 C++ 中,当我们定义一个类或结构体时,我们可以使用初始化列表来初始化类或结构体的成员变量。初始化列表提供了一种高效的方式来初始化类或结构体成员变量,特别是在初始化对性能要求很高的类时。 什么是初始化列表 初始化列表是一种用于初始化类或结构体成员变量的语法结构。通过初始化列表,我们可以在构造函数中以一种简洁和高效的方式初…

    other 2023年6月20日
    00
  • React生命周期与父子组件间通信知识点详细讲解

    React生命周期与父子组件间通信是React开发中非常重要的知识点。在React中,组件的生命周期由一系列函数构成,这些函数在组件的不同阶段被调用。同时,React也提供了多种方法,允许父组件与子组件之间进行通信。本文将从以下几个方面进行详细讲解: React组件生命周期 React组件生命周期由一系列特定的函数构成,这些函数会在组件被实例化、更新和卸载等…

    other 2023年6月27日
    00
  • 易语言实现对比版本号检查是否需要更新的代码

    当使用易语言编写程序时,可以通过比较版本号来检查是否需要更新。下面是一个完整的攻略,包含了两个示例说明。 步骤一:获取当前版本号和最新版本号 首先,需要获取当前程序的版本号和最新版本号。可以通过以下代码来实现: // 获取当前版本号 当前版本号 = 程序版本号(); // 获取最新版本号 最新版本号 = 网络请求(\"https://example…

    other 2023年8月2日
    00
  • Shell脚本变量的只读 删除 类型及注释语法基础

    Shell脚本变量的只读、删除、类型及注释语法基础攻略 Shell脚本是一种用于自动化任务的脚本语言,变量是Shell脚本中非常重要的概念之一。在本攻略中,我们将详细讲解Shell脚本中变量的只读、删除、类型及注释语法基础。 变量的定义和赋值 在Shell脚本中,变量可以通过以下方式定义和赋值: variable_name=value 其中,variable…

    other 2023年8月15日
    00
  • IOS上实现的自定义仪表盘示例

    IOS上实现的自定义仪表盘示例攻略 1. 简介 自定义仪表盘是一种可视化控件,用于展示应用程序的指定数据,并提供了更加智能、直观和互动的方式与用户进行数据交互。在IOS平台上,自定义仪表盘以其独特的样式和极致的性能优化得到了广泛的应用和普及。 2. 实现流程 2.1 步骤一:创建一个新的IOS应用程序项目 在创建一个新的IOS应用程序项目时,需要选择一个合适…

    other 2023年6月25日
    00
  • 详解vue 2.6 中 slot 的新用法

    详解Vue 2.6中Slot的新用法攻略 简介 在Vue 2.6中,Slot(插槽)的用法得到了一些新的改进和扩展。Slot是Vue中一种强大的组件通信机制,它允许父组件向子组件传递内容,使得组件的复用更加灵活和可扩展。 默认插槽 默认插槽是Vue中最基本的插槽类型。它允许父组件在子组件中插入内容,并且在子组件中使用该内容。在Vue 2.6中,我们可以使用v…

    other 2023年8月21日
    00
  • 简单谈谈vue的过渡动画(推荐)

    以下是关于Vue的过渡动画的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 Vue的过渡动画是一种在Vue组件之间切换时添加动画效果的方法。它可以通过Vue的内置过渡组件或自定义过渡类名来实现。 使用方法 以下是使用Vue的过渡动画的步骤: 在Vue组件中添加过渡组件或自定义过渡类名。 html <transition name=”fade”…

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