Skip to content

Commit 68cb019

Browse files
committed
创建数据库
1 parent 6aa608b commit 68cb019

File tree

2 files changed

+275
-16
lines changed

2 files changed

+275
-16
lines changed

docs/mysql/database.md

Lines changed: 200 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: MySQL数据库的基本操作
2+
title: MySQL数据库的基本操作,包括创建数据库、切换数据库、删除数据库
33
shortTitle: MySQL数据库的基本操作
44
---
55

@@ -11,17 +11,17 @@ shortTitle: MySQL数据库的基本操作
1111

1212
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240125185015.png)
1313

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

1616
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240125185214.png)
1717

18-
分号 `;` 是 MySQL 的语句结束符。
18+
也就是说,分号 `;` 是 MySQL 的语句结束符。
1919

20-
OK,像上面截图中的 information_schema、mysql、performance_schema、sys 这些都是 MySQL 自带的数据库,剩余的 cmower、codingmore、jeesite、jepf、pai_coding 等都是我本地创建的数据库。
20+
OK,像上面截图中的 information_schema、mysql、performance_schema、sys 这些都是 MySQL 自带的数据库,剩余的 cmower、codingmore、jeesite、jepf、pai_coding 等都是我本地创建的数据库,这些数据库名大家很容易就联系到某些有点名气的开源项目,比如说技术派
2121

22-
[二哥的 MySQL 进阶之路](https://javabetter.cn/mysql/)会结合[技术派实战项目](https://paicoding.com)来讲解 MySQL 的基本操作。其中的 pai_coding 就是技术派项目的数据库
22+
[二哥的 MySQL 进阶之路](https://javabetter.cn/mysql/)会结合[技术派实战项目](https://javabetter.cn/zhishixingqiu/paicoding.html)来讲解 MySQL 的基本操作。
2323

24-
对技术派项目还不太了解的小伙伴可以戳下面的链接了解:
24+
上面截图中的 pai_coding 就是技术派项目的数据库。对技术派项目还不太了解的小伙伴可以戳下面的链接了解:
2525

2626
[二哥的原创实战项目技术派详细介绍](https://javabetter.cn/zhishixingqiu/paicoding.html)
2727

@@ -103,6 +103,200 @@ drop database test;
103103
104104
但删库跑路之前,最好掐一下自己的大腿,看看自己是不是清醒着,不然后悔都来不及(😂)。
105105
106+
删除数据库的时候,也可以带上 `if exists`,这样当数据库不存在的时候,就不会报错了。
107+
108+
```sql
109+
drop database if exists test;
110+
```
111+
112+
## 技术派是如何创建数据库的?
113+
114+
技术派创建数据库是自动完成的,当项目启动的时候就会自动创建数据库。
115+
116+
具体实现的方法我放在了技术派的教程里,大家可以通过这个链接获取技术派实战教程。
117+
118+
[二哥的原创实战项目技术派详细介绍](https://javabetter.cn/zhishixingqiu/paicoding.html)
119+
120+
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240126170719.png)
121+
122+
这里我做一些简单的介绍,实现源码在 ForumDataSourceInitializer 这个类中。
123+
124+
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240126170743.png)
125+
126+
注意看 autoInitDatabase 方法,这里是自动创建数据库的逻辑。
127+
128+
```java
129+
private boolean autoInitDatabase() {
130+
// 查询失败,可能是数据库不存在,尝试创建数据库之后再次测试
131+
132+
// 数据库链接
133+
URI url = URI.create(SpringUtil.getConfigOrElse("spring.datasource.url", "spring.dynamic.datasource.master.url").substring(5));
134+
// 用户名
135+
String uname = SpringUtil.getConfigOrElse("spring.datasource.username", "spring.dynamic.datasource.master.username");
136+
// 密码
137+
String pwd = SpringUtil.getConfigOrElse("spring.datasource.password", "spring.dynamic.datasource.master.password");
138+
// 创建连接
139+
try (Connection connection = DriverManager.getConnection("jdbc:mysql://" + url.getHost() + ":" + url.getPort() +
140+
"?useUnicode=true&characterEncoding=UTF-8&useSSL=false", uname, pwd);
141+
Statement statement = connection.createStatement()) {
142+
// 查询数据库是否存在
143+
ResultSet set = statement.executeQuery("select schema_name from information_schema.schemata where schema_name = '" + database + "'");
144+
if (!set.next()) {
145+
// 不存在时,创建数据库
146+
String createDb = "CREATE DATABASE IF NOT EXISTS " + database;
147+
connection.setAutoCommit(false);
148+
statement.execute(createDb);
149+
connection.commit();
150+
log.info("创建数据库({})成功", database);
151+
if (set.isClosed()) {
152+
set.close();
153+
}
154+
return true;
155+
}
156+
set.close();
157+
log.info("数据库已存在,无需初始化");
158+
return false;
159+
} catch (SQLException e2) {
160+
throw new RuntimeException(e2);
161+
}
162+
}
163+
```
164+
165+
逻辑很简单,就是根据 URL、用户名、密码创建数据库连接,客户端到服务端的连接,然后从 `information_schema.schemata` 表中查询数据库是否存在,如果不存在,就创建数据库。
166+
167+
用的是最原始的 JDBC 方式,以及一些 Spring 方面的知识,这里就不展开了。大家看代码注释应该是能懂的。
168+
169+
information_schema 是 MySQL 的元数据信息,数据库的信息会存放在 schemata 表中。我们可以通过终端查看到 schemata 表的结构。
170+
171+
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240126171959.png)
172+
173+
这里给大家留一个作业题,如果你之前学过 Java 或者 Spring Boot 的话,可以仿照技术派的方式实现一个自动创建数据库的功能。
174+
175+
### Java 原生
176+
177+
Java 原生代码需要你先下载一个 MySQL 的 JDBC 驱动,驱动的作用是让 Java 程序能够和 MySQL 数据库进行交互。
178+
179+
[MySQL Connector/J](https://dev.mysql.com/downloads/connector/j/)
180+
181+
![](https://cdn.tobebetterjavaer.com/stutymore/database-20240126174913.png)
182+
183+
184+
将下载的 `.jar` 包放到项目 classpath 下,什么是 classpath,一般就是项目的 `src/main/resources` 目录,或者是项目的 `lib` 目录。
185+
186+
接下来,编写一个 Java 类来连接到 MySQL 服务器,并在数据库不存在时创建它:
187+
188+
```java
189+
class DatabaseCreator {
190+
191+
private static final String URL = "jdbc:mysql://localhost:3306/?useSSL=false&serverTimezone=UTC";
192+
private static final String USER = "root";
193+
private static final String PASSWORD = "123456";
194+
private static final String DATABASE_NAME = "pai_coding";
195+
196+
public static void main(String[] args) {
197+
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
198+
Statement stmt = conn.createStatement()) {
199+
200+
if (!databaseExists(conn, DATABASE_NAME)) {
201+
stmt.executeUpdate("CREATE DATABASE " + DATABASE_NAME);
202+
System.out.println("Database created successfully");
203+
} else {
204+
System.out.println("Database already exists");
205+
}
206+
} catch (SQLException e) {
207+
e.printStackTrace();
208+
}
209+
}
210+
211+
private static boolean databaseExists(Connection conn, String dbName) throws SQLException {
212+
ResultSet resultSet = conn.getMetaData().getCatalogs();
213+
214+
while (resultSet.next()) {
215+
if (dbName.equals(resultSet.getString(1))) {
216+
return true;
217+
}
218+
}
219+
220+
return false;
221+
}
222+
}
223+
```
224+
225+
### Spring Boot
226+
227+
Spring Boot 项目的话,就比较省事了,不用去下载驱动,直接在 pom.xml 文件中添加 MySQL 的驱动依赖就可以了。
228+
229+
```xml
230+
<dependency>
231+
<groupId>mysql</groupId>
232+
<artifactId>mysql-connector-java</artifactId>
233+
<version>8.0.19</version>
234+
</dependency>
235+
```
236+
237+
接着在 application.yml 配置文件中,设置数据库的基本连接信息。
238+
239+
```yaml
240+
spring:
241+
datasource:
242+
url: jdbc:mysql://localhost:3306/?useSSL=false&serverTimezone=UTC
243+
username: root
244+
password: 123456
245+
```
246+
247+
然后在 Spring Boot 的启动类中创建数据库。
248+
249+
```java
250+
@SpringBootApplication
251+
public class PaiCodingApplication {
252+
253+
public static void main(String[] args) {
254+
SpringApplication.run(PaiCodingApplication.class, args);
255+
}
256+
257+
@Bean
258+
public CommandLineRunner initDatabase(DataSource dataSource) {
259+
return args -> {
260+
try (Connection conn = dataSource.getConnection();
261+
Statement stmt = conn.createStatement()) {
262+
263+
if (!databaseExists(conn, "pai_coding")) {
264+
stmt.executeUpdate("CREATE DATABASE pai_coding");
265+
System.out.println("Database created successfully");
266+
} else {
267+
System.out.println("Database already exists");
268+
}
269+
} catch (SQLException e) {
270+
e.printStackTrace();
271+
}
272+
};
273+
}
274+
275+
private static boolean databaseExists(Connection conn, String dbName) throws SQLException {
276+
ResultSet resultSet = conn.getMetaData().getCatalogs();
277+
278+
while (resultSet.next()) {
279+
if (dbName.equals(resultSet.getString(1))) {
280+
return true;
281+
}
282+
}
283+
284+
return false;
285+
}
286+
}
287+
```
288+
289+
大家可以尝试下,看看能不能成功。
290+
291+
更详细的参考答案和源码我放在了这个链接里:[Spring Boot 整合 MySQL 和 Druid](https://javabetter.cn/springboot/mysql-druid.html)
292+
293+
## 小结
294+
295+
本篇我们主要讲解了 MySQL 数据库的基本操作,包括创建数据库、切换数据库、删除数据库。
296+
297+
并结合技术派实战项目来讲解了技术派是如何自动创建数据库的。以及如何通过 Java 原生代码和 Spring Boot 项目来创建数据库。
298+
299+
希望大家动动手,练习一下,实战和理论真正的结合起来,冲鸭😁。
106300
107301
----
108302

docs/springboot/mysql-druid.md

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ MySQL 目前主推的版本是 8.0,参考手册的地址如下所示:
2222
2323
## 如何安装 MySQL
2424

25+
我在讲 MySQL 的时候也有专门讲过,更详细:[MySQL 的安装(Windows、macOS、Linux)](https://javabetter.cn/mysql/install.html)
26+
2527
如果有云服务器的话,建议安装在云服务器上,这样就可以长时间运行 MySQL 而不用担心服务重启的问题。按照步骤参照下面的文档。
2628

2729
>[https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html](https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html)
@@ -244,9 +246,10 @@ Druid 是阿里巴巴开源的一款数据库连接池,结合了C3P0、DBCP
244246

245247
Druid 在 GitHub 上已经收获了 25.4k 的 star,可以说非常的知名,从简介上也能看得出,Druid 就是为了监控而生的。
246248

247-
>[https://github.com/alibaba/druid/](https://github.com/alibaba/druid/)
249+
> [https://github.com/alibaba/druid/](https://github.com/alibaba/druid/)
250+
248251

249-
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-a1f53d5b-1048-4707-bebc-1a59d7793880.png)
252+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-a1f53d5b-1048-4707-bebc-1a59d7793880.png#id=n2yqp&originHeight=552&originWidth=1100&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
250253

251254
Druid 包含了三个重要的组成部分:
252255

@@ -256,7 +259,7 @@ Druid 包含了三个重要的组成部分:
256259

257260
Spring Boot2.0 以上默认使用的是 Hikari 连接池,我们从之前的日志信息里就可以看得到。
258261

259-
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-0982b47e-b211-41a6-ab88-355e1d2ae7be.png)
262+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-0982b47e-b211-41a6-ab88-355e1d2ae7be.png#id=K9tfC&originHeight=564&originWidth=2744&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
260263

261264
那如果我们想使用 Druid 的话,该怎么整合呢?
262265

@@ -274,17 +277,79 @@ Spring Boot2.0 以上默认使用的是 Hikari 连接池,我们从之前的日
274277

275278
第二步,在 application.yml 文件中添加 Druid 配置。
276279

277-
----
280+
```
281+
spring:
282+
datasource:
283+
type: com.alibaba.druid.pool.DruidDataSource
284+
druid:
285+
#初始化连接池大小
286+
initial-size: 5
287+
#配置最小连接数
288+
min-idle: 5
289+
#配置最大连接数
290+
max-active: 200
291+
#配置连接等待超时时间
292+
max-wait: 60000
293+
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
294+
time-between-eviction-runs-millis: 60000
295+
#配置一个连接在池中最小生存的时间,单位是毫秒
296+
min-evictable-idle-time-millis: 300000
297+
#测试连接
298+
validation-query: SELECT 1 FROM DUAL
299+
#申请连接的时候检测,建议配置为true,不影响性能,并且保证安全
300+
test-while-idle: true
301+
#获取连接时执行检测,建议关闭,影响性能
302+
test-on-borrow: false
303+
#归还连接时执行检测,建议关闭,影响性能
304+
test-on-return: false
305+
#是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
306+
pool-prepared-statements: false
307+
#开启poolPreparedStatements后生效
308+
max-pool-prepared-statement-per-connection-size: 20
309+
#配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
310+
filters: stat,wall,slf4j
311+
#打开mergeSql功能;慢SQL记录
312+
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
313+
#配置DruidStatFilter
314+
web-stat-filter:
315+
enabled: true
316+
url-pattern: "/*"
317+
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
318+
#配置DruidStatViewServlet
319+
stat-view-servlet:
320+
url-pattern: "/druid/*"
321+
#登录名
322+
login-username: root
323+
#登录密码
324+
login-password: root
325+
```
278326

279-
更多内容,只针对《二哥的Java进阶之路》星球用户开放,需要的小伙伴可以[戳链接🔗](https://javabetter.cn/zhishixingqiu/)加入我们的星球,一起学习,一起卷。。**编程喵**🐱是一个 Spring Boot+Vue 的前后端分离项目,融合了市面上绝大多数流行的技术要点。通过学习实战项目,你可以将所学的知识通过实践进行检验、你可以拓宽自己的技术边界,你可以掌握一个真正的实战项目是如何从 0 到 1 的
327+
第三步,重启项目。在日志信息里可以看到 Druid 的初始化信息
280328

281-
----
329+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-06115c50-5741-482f-b5c0-45c55017098f.png#id=Wnc1o&originHeight=642&originWidth=2244&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
330+
331+
第四步,通过 `http://localhost:9002/druid/` 地址就可以在浏览器访问 Druid 的监控页面了,用户名和密码是我们在配置文件里指定的 root 和 root,登录后是这样的。
332+
333+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-daaf401e-e4c4-4057-9b3b-d605eefb6eb3.png#id=C7ZKf&originHeight=1546&originWidth=2744&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
334+
335+
更多关于监控的配置信息,可以到 Druid 的 GitHub 仓库查看。
282336

283-
## 源码地址
337+
> [https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)
338+
339+
340+
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/springboot/mysql-druid-a5db84fc-1030-4a38-824d-4e649ad2b768.png#id=hcluY&originHeight=1020&originWidth=1414&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
341+
342+
### 源码地址
284343

285344
> - 编程喵 GitHub:[https://github.com/itwanger/coding-more](https://github.com/itwanger/coding-more)
286-
> - codingmore-mysql-druid[https://github.com/itwanger/codingmore-learning](https://github.com/itwanger/codingmore-learning/tree/main/codingmore-mysql)
345+
> - codingmore-mysql:[https://github.com/itwanger/codingmore-learning/tree/main/codingmore-mysql](https://github.com/itwanger/codingmore-learning/tree/main/codingmore-mysql)
287346
288-
---
289347

290-
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png)
348+
----
349+
350+
GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 10000+ 的 Java 教程](https://javabetter.cn/overview/)
351+
352+
353+
微信搜 **沉默王二** 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 **222** 即可免费领取。
354+
355+
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png)

0 commit comments

Comments
 (0)