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

yizhihongxing

在 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日

相关文章

  • OpenvSwitch系列之五 网桥特性功能配置

    OpenvSwitch系列之五 网桥特性功能配置的完整攻略 OpenvSwitch是一种开源的虚拟交换机,可以用于构建虚拟网络。在OpenvSwitch中,网桥是一种基本的网络设备,可以用于连接多个虚拟机或物理机。本文将介绍网桥的特性功能配置,包括端口镜像、流量控制、QoS等,并提供两个示例说明。 端口镜像 端口镜像是一种网络监控技术,可以将一个端口的流量复…

    other 2023年5月5日
    00
  • j-linkv9固件修复

    以下是关于“J-Link V9固件修复”的完整攻略,过程中包含两个示例。 背景 J-Link V9是一种常用的调试器,它可以用于多种不同的微控制器。在使用J-Link V9时,有时会出现固件损坏的情况。在本攻略中,我们将介绍如何修复J-Link V9固件。 基本原理 J-Link V9固件修复的基本原理是通过JLink Commander软件将新的固件烧录到…

    other 2023年5月9日
    00
  • 详解Linux下find查找文件命令和grep查找文件命令

    下面我将详细讲解Linux下find查找文件命令和grep查找文件命令的攻略。 find查找文件命令 命令格式 find [path] [expression] 其中,path为要查找的目录或文件,不填则默认为当前目录;expression为查找的表达式,用于对文件名进行匹配或对文件属性进行查找。 常用参数 -name:按照文件名进行查找; -type:按照…

    other 2023年6月26日
    00
  • PHP通过文件路径获取文件名的实例代码

    下面是 PHP 通过文件路径获取文件名的攻略及实例代码: 函数介绍 PHP 提供多个函数,可以通过文件路径获取文件名,其中最常用的是 basename() 和 pathinfo() 函数。 basename() basename() 函数返回路径中的文件名部分。它的用法如下: basename($path, $suffix); 其中,$path 是要获取文件…

    other 2023年6月26日
    00
  • 一文掌握new Date() 方法

    一文掌握new Date() 方法 简介 在 JavaScript 中,使用 Date 对象可以处理日期和时间。其中常用的创建一个新的 Date 对象的方法是 new Date()。 语法 new Date() 方法没有参数,即不传入任何参数,这样创建的 Date 对象的日期默认是当前日期和时间。 如果传入参数,则参数的类型可以是以下之一: 数字:参数表示从…

    other 2023年6月27日
    00
  • javascript中数组的定义及使用实例

    当谈到javascript时,数组是一个非常重要的数据类型。数组有许多方便而强大的方法可以用来操作和处理数据。在本篇攻略中,我们将讨论如何在JavaScript中定义一个数组,并详细介绍如何使用数组的各种属性和方法。 定义数组 在JavaScript中定义数组很简单,可以使用方括号“[ ]”来定义一个空数组,或者在方括号中包含一些初始值来定义一个有内容的数组…

    other 2023年6月25日
    00
  • ensp防火墙简单配置

    以下是关于“ensp防火墙简单配置”的完整攻略,过程中包含两个示例。 背景 ENSP是华为公司推出的一款网络安全产品,其中包括防火墙功能。在使用ENSP防火墙时,我们需要进行一些简单的配置,以确保其能够正常工作。本攻略将介绍如何进行ENSP防火墙的简单配置。 基本原理 ENSP防火墙是一种网络安全设备,用于保护网络免受恶意攻击。在使用ENSP防火墙时,我们需…

    other 2023年5月9日
    00
  • php基础知识之———匿名函数(anonymousfunctions)

    PHP基础知识之——匿名函数(anonymous functions) 什么是匿名函数? 匿名函数是一种没有函数名的函数,它通常在需要使用一次的地方被定义和调用,不需要事先定义一个函数名,只需要将函数定义在需要的位置即可。在PHP中,匿名函数又被称为闭包函数。 如何定义匿名函数? 定义匿名函数的方式是使用单词function后跟得表达式,例如: $print…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部