MySQL 的数据库操作,利用Spring Boot实现MySQL数据库的自动创建

执行 show databases; 命令可以查看当前数据库的所有数据库。

注意在 MySQL 客户端执行 SQL 语句的时候要带上分号 ; 并按下 enter 键,不然 MySQL 会认为你还没有输入完,会换一行继续等待你输入。

OK,像上面截图中的 information_schema、mysql、performance_schema、sys 这些都是 MySQL 自带的数据库,剩余的 、codingmore、pai_coding 等都是我本地创建的数据库。

上面截图中的 pai_coding 就是技术派项目的数据库。

创建数据库

语法:create database 数据库名;

比如说我要创建一个名为 test 的数据库,就可以执行:

create database test;

如果提示 Query OK, 1 row affected (0.02 sec),说明数据库创建成功了。

再用 show databases; 命令查看一下,就可以看到 test 数据库了。

一个小技巧:MySQL 会记忆之前输入过的命令,使用键盘上的Tab上下箭头按键可以切换命令。

通常情况下,我们在创建数据库的时候会额外加上 if not exists,否则当数据库已经存在的时候,会报 database exists 的错误。

create database test;
ERROR 1007 (HY000): Can't create database 'test'; database exists

我们可以这样写:

create database if not exists test;
Query OK, 1 row affected, 1 warning (0.00 sec)

可以看到,SQL 语句执行成功了,但会有一个 warning 警告,这是因为数据库已经存在了,所以 MySQL 会提示我们。

切换数据库

语法:

use 数据库名;

比如说我们要切换到技术派的 pai_coding 数据库,就可以执行:

use pai_coding;

如果提示 Database changed,说明切换成功了。

只有切换到技术派数据库下,我们才能对技术派数据库下面的表进行操作。

删除数据库

删除数据库语法:

drop database 数据库名;

比如说我们要删除 test 数据库,就可以执行:

drop database test;

删除数据库的时候,也可以带上 if exists,这样当数据库不存在的时候,就不会报错了。

drop database if exists test;

技术派是如何创建数据库的?

技术派创建数据库是自动完成的,当项目启动的时候就会自动创建数据库。

具体实现的方法我放在了我的项目专栏里面‘“自动初始化数据库”

这里我做一些简单的介绍,实现源码在 ForumDataSourceInitializer 这个类中。

注意看 autoInitDatabase 方法,这里是自动创建数据库的逻辑。

  /*** 数据库不存在时,尝试创建数据库*/private boolean autoInitDatabase() {// 查询失败,可能是数据库不存在,尝试创建数据库之后再次测试URI url = URI.create(SpringUtil.getConfig("spring.datasource.url").substring(5));String uname = SpringUtil.getConfig("spring.datasource.username");String pwd = SpringUtil.getConfig("spring.datasource.password");try (Connection connection = DriverManager.getConnection("jdbc:mysql://" + url.getHost() + ":" + url.getPort() +"?useUnicode=true&characterEncoding=UTF-8&useSSL=false", uname, pwd);Statement statement = connection.createStatement()) {ResultSet set = statement.executeQuery("select schema_name from information_schema.schemata where schema_name = '" + database + "'");if (!set.next()) {// 不存在时,创建数据库String createDb = "CREATE DATABASE IF NOT EXISTS " + database;connection.setAutoCommit(false);statement.execute(createDb);connection.commit();log.info("创建数据库({})成功", database);if (set.isClosed()) {set.close();}return true;}set.close();log.info("数据库已存在,无需初始化");return false;} catch (SQLException e2) {throw new RuntimeException(e2);}}

逻辑很简单,就是根据 URL、用户名、密码创建数据库连接,客户端到服务端的连接,然后从 information_schema.schemata 表中查询数据库是否存在,如果不存在,就创建数据库。

用的是最原始的 JDBC 方式,以及一些 Spring 方面的知识,这里就不展开了。大家看代码注释应该是能懂的。

information_schema 是 MySQL 的元数据信息,数据库的信息会存放在 schemata 表中。我们可以通过终端查看到 schemata 表的结构。

Java 原生

Java 原生代码需要你先下载一个 MySQL 的 JDBC 驱动,驱动的作用是让 Java 程序能够和 MySQL 数据库进行交互。

MySQL :: Download Connector/J

将下载的 .jar 包放到项目 classpath 下,什么是 classpath,一般就是项目的 src/main/resources 目录,或者是项目的 lib 目录。

接下来,编写一个 Java 类来连接到 MySQL 服务器,并在数据库不存在时创建它:

class DatabaseCreator {private static final String URL = "jdbc:mysql://localhost:3306/?useSSL=false&serverTimezone=UTC";private static final String USER = "root";private static final String PASSWORD = "Codingmore123";private static final String DATABASE_NAME = "pai_coding";public static void main(String[] args) {try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);Statement stmt = conn.createStatement()) {if (!databaseExists(conn, DATABASE_NAME)) {stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + DATABASE_NAME);System.out.println("数据库创建成功");} else {System.out.println("数据库已经存在");}} catch (SQLException e) {e.printStackTrace();}}private static boolean databaseExists(Connection conn, String dbName) throws SQLException {ResultSet resultSet = conn.getMetaData().getCatalogs();while (resultSet.next()) {if (dbName.equals(resultSet.getString(1))) {return true;}}return false;}
}

这里简单解释一下大家可能比较陌生的代码:

先说 main 方法:

①、DriverManager.getConnection(URL, USER, PASSWORD):通过 JDBC 建立到 MySQL 服务器的连接。

②、conn.createStatement():创建一个 Statement 对象来执行 SQL 命令。

③、stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + DATABASE_NAME):执行 SQL 命令,创建数据库。这就和我们本篇的主题串起来了,哈哈😆。

再说 databaseExists 方法:

①、使用 Connection 对象的 getMetaData() 方法可以获取数据库的元数据。这个元数据包含了服务器上所有数据库的信息。

②、getCatalogs() 方法可以获取服务器上所有数据库的列表,返回的 ResultSet 对象包含了服务器上每个数据库的名称。

③、resultSet.getString(1) 方法可以获取当前行第一列的值,也就是数据库的名称。

Spring Boot

Spring Boot 项目的话,就比较省事了,不用去下载驱动,直接在 pom.xml 文件中添加 MySQL 的驱动依赖就可以了。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>

然后在 Spring Boot 的测试类中进行数据库创建操作。

@Slf4j
@SpringBootTest(classes = QuickForumApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class DatabaseCreationTest {@Autowiredprivate DataSource dataSource;@Autowiredprivate JdbcTemplate jdbcTemplate;@Testpublic void createDatabaseTest() throws SQLException {String dbName = "pai_coding";if (!databaseExists(dbName)) {jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS " + dbName);System.out.println("创建成功");} else {System.out.println("已存在");}}private boolean databaseExists(String dbName) throws SQLException {try (Connection connection = dataSource.getConnection();Statement statement = connection.createStatement()) {ResultSet set = statement.executeQuery("select schema_name from information_schema.schemata where schema_name = '" + dbName + "'");return set.next();}}
}

这里也简单解释一下大家可能比较陌生的代码:

①、@Slf4j:Lombok库提供注解,用于自动创建日志对象(比如 Logger)。

②、@SpringBootTest(classes = QuickForumApplication.class):表示这是一个 Spring Boot 的集成测试类,它会加载技术派QuickForumApplication 类指定的 Spring Boot 应用程序上下文。

③、@RunWith(SpringJUnit4ClassRunner.class):使用 JUnit4 来支持 Spring 上下文测试。

④、@Autowired:自动注入 DataSource 和 JdbcTemplate 对象。

大家可以尝试下,看看能不能成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/497887.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用IDEA连接MySQL数据库 - 一篇全面的指南

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Algorithms 4】算法(第4版)学习笔记 13 - 番外篇:二叉查找树的几何应用(下篇)

文章目录 前言参考目录学习笔记4&#xff1a;区间搜索树&#xff08;interval search trees&#xff09;4.1&#xff1a;一维区间搜索4.2&#xff1a;区间搜索树定义4.3&#xff1a;区间搜索树 demo 演示4.3.1&#xff1a;插入4.3.2&#xff1a;搜索命中4.3.3&#xff1a;搜索未…

本届挑战赛冠军方案:基于LLM的多场景智能运维

本文介绍本届挑战赛冠军得主SRE-Copilot团队的参赛方案&#xff1a;基于LLM的多场景智能运维。 基础架构-SRE&#xff0c;负责字节跳动基础架构部门所有组件的SRE工作&#xff0c;沿着成本、稳定性、效率、服务四条主线&#xff0c;致力于打造高扩展、高可用的生产系统。基础架…

IntelliJ IDEA 使用 spring Initializr 快速搭建 spring boot 项目遇到的坑

maven使用的是3.5.3 一、创建SpringBoot 二、项目创建成功&#xff0c;启动右键&#xff0c;没有run方法 三、在pom.xml上右键&#xff0c;将其添加为maven项目&#xff0c;然后发现Test模块报错 四、查看pom.xml文件&#xff0c;发现2.3.5Release版本变红&#xff0c;怀疑是版…

基于springboot实现的牙科诊所系统

一、系统架构 前端&#xff1a;html | layui | js | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. web端-首页 02. web端-医生介绍 03. web端-新闻资讯 04. web端-关于我们 05. web…

Find My运动相机|苹果Find My技术与相机结合,智能防丢,全球定位

运动相机设计用于在各种运动和极限环境中使用&#xff0c;如徒步、登山、攀岩、骑行、滑翔、滑雪、游泳和潜水等&#xff0c;它们通常具有防抖防震、深度防水和高清画质的特点&#xff0c;能够适应颠簸剧烈的环境&#xff0c;甚至可以承受一定程度的摔落&#xff0c;一些运动相…

云原生精品资料合集(附下载)

云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声&#xff0c;以应用价值为中心的云原生时代已经到&#xff0c;所以IT人员学习云原生正当时&#xff01;最近跟各位大神征集了云原生的教程&#xff0c;行业报告和最佳实践&#xff0c;总有一款适…

Go语言学习-下载

下载网址 https://go.dev/dl/ 选择合适的版本&#xff0c;下载 解压包&#xff0c;按引导下载 完成后打开终端 输入指令 go version看到下载好的版本&#xff0c;就是完成下载了

Unity 常用操作

2D素材网站 https://craftpix.net/ https://itch.io/game-assets/tag-2d/tag-backgrounds 3D素材资源网址 https://www.mixamo.com/#/ 场景常用操作&#xff1a; 快捷键&#xff1a;QWER Q&#xff1a;Q键或鼠标中键&#xff0c;可以拉动场景。 W&#xff1a;选中物体后&…

全局路由守卫报重定向错误

一、报错内容 但是这种情况下&#xff0c;会报路由重定向的错误&#xff0c;如下&#xff1a; Uncaught (in promise) Error: Redirected when going from “/home?_presNosearchoutNo” to “/presSearch” via a navigation guard. 二、报错原因 要给这个项目的所有路由…

前后端分离Vue+nodejs酒店公寓客房预订管理系统udr7l-java-php-django-springboot

本系统的设计与实现共包含13个表:分别是关于我们信息表&#xff0c;配置文件信息表&#xff0c;公寓信息评论表信息表&#xff0c;公寓入住信息表&#xff0c;公寓退房信息表&#xff0c;公寓信息信息表&#xff0c;公寓预订信息表&#xff0c;系统公告信息表&#xff0c;收藏表…

使用Java和PostGis的全国A级风景区数据入库实战

目录 前言 一、数据介绍 1、空间数据 2、属性表说明 3、QGIS数据预览 二、PostGIS空间数据库设计 1、空间表结构 三、Java空间入库 1、实体定义 2、数据操作Mapper 3、业务层实现 4、入库 5、数据入库验证 总结 前言 星垂平野阔&#xff0c;月涌大江流”“晴川历历…