微服务: MySQL基本操作
简介
本篇是 微服务系列 的第 N 篇,从本篇开始我们就要接触和学习数据库相关的知识了。
数据库我们选择 MySQL 数据库,免费且资料多,大部分公司都会使用该数据库。我是在 Windows 10
上面搭建的微服务开发环境,同理,MySQL 数据库也是在这个系统上面安装的并且使用的是 MySQL8.0 版本,如果你还没有安装或者在安装 MySQL8.0 遇到问题可以参考 MySQL8.0.15在Win10上的折腾记 这篇文章。
今天主要跟大家分享如何使用 SpringBoot 结合 JDBC 连接和操作 MySQL 数据库,主要还是以实例为主。
JDBC、ODBC、MySQL Connectors
在说实例之前,带大家先了解一下标题中几个名词的概念。
JDBC(Java database connectivity,数据连接),是 Sun 公司编的一堆类和方法,都封装在 java.sql
包中,可以利用这些类和方法来把你的 Java 程序和任意的数据库连通。即通过使用 JDBC,Java 开发人员可以将 SQL 语句传送给几乎任何一种数据库。
对应的还有 ODBC( Open Database Connectivity, 开放数据库互连),ODBC 是 Microsoft 提出的数据库访问接口标准。开放数据库互连定义了访问数据库 API 的一个规范,Microsoft 的 ODBC 文档是用 C 语言描述的,许多实际的 ODBC 驱动程序也是用 C 语言写的。ODBC 提供了对 SQL 语言的支持,用户可以直接将 SQL 语句送给 ODBC。
JDBC 和 ODBC 都是用来连接数据库的启动程序,两者具有数据库独立性甚至平台无关性。
MySQL Connectors 是 MySQL 数据库的驱动(程序),有对各种语言的支持。mysql-connector-java
(也称之为 Connector/J 或者 mysql-connector-jdbc) 是 MySQL-Connectors 的 Java 版本的一个实现 ,用它可以连接 MySQL 系统。
同理,还有 mysql-connector-python
、mysql-connector-c
、 mysql-connector-ODBC
、mysql-connector-jdbc
等,如下图(来自 MySQL Connectors 官网):
可以使用下面的图简单描述一下JDBC和数据连接的示意图,如下图:
一图胜千言,Java 应用程序可以通过 JDBC 和数据库驱动程序连接、访问、操作数据库(MySQL、Oracle等)。
配置 pom 文件
我还是用 Github 代码仓库的例子,大家可以自行 Clone 代码。
打开工程的 pom.xml
文件,增加 mysql-connector-java
和 spring-boot-starter-jdbc
依赖,从上面内容大家应该可以理解为什么要加入这两项了吧!
1 | <!--mysql-connector-java--> |
等待 Maven 下载完成这两项依赖。
配置 properties
打开 application-dev.properties
文件,增加如下内容:
1 | # jdbc |
其中 mzc_user
是我创建的数据库文件名称,大家要根据自己的实际情况做相关的修改。配置 properties 注意以下几个问题。
1、spring.datasource.driver-class-name 的配置
如果配置值为 com.mysql.jdbc.Driver
,会报下面的警告:
1 | Loading class `com.mysql.jdbc.Driver'. This is deprecated. |
意思是这个类已经过时了,请使用最新的 jdbc.driver
修改数据源配置,如下:
1 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
2、spring.datasource.url 的配置
关于这个url 的配置,官方有更加详细的配置说明,可以参考 Connection URL Syntax 和 Configuration Properties 两篇文档。
如果配置为 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user
,会一直报如下错误:
1 | The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. |
解决这个问题,有如下3种解决方案。
1、指定时区
1 | // 北京时间东八区 |
注意,%2B
是 +
的编码格式。
如果你设置 serverTimezone=UTC
,连接不报错, 但在用java代码插入到数据库时间的时候却出现了问题。
比如在 Java 代码里面插入的时间为 2018-06-24 17:29:56
,但是在数据库里面显示的时间却为 2018-06-24 09:29:56
,这样就有了8个小时的时差。UTC 代表的是全球标准时间 ,而我们使用的时间是北京时区也就是东八区,领先 UTC 八个小时。
1 | // 京时间东八区 |
2、修改 MySQL 配置文件
我在 Windows 10
找到 MySQL 配置文件 my.ini
,如果你没有找到可以参考 MySQL8.0.15在Win10上的折腾记 这篇文章,非 Windows
系统可能配置文件时 my.cnf
。
在配置文件中,增加默认时区配置:
1 | default-time-zone='+08:00' |
在 my.ini
或者 my.cnf
文件的 [mysqld]
下面增加上面配置,示例如下:
1 | [mysqld] |
修改配置文件之后,重启MySQL服务就可以了。
3、修改数据库, 配置全局时区
切换到名称为 mysql
的数据库,然后执行下面的语句:
1 | show variables like '%time_zone%'; |
设置完成后,可以使用 show variables like '%time_zone%';
看看是否修改成功。
你也可以执行,但是只能对当前的 session 生效,示例如下:
1 | # 设置当前session时区,即时生效,但仅作用于当前session |
我个人使用的是上述中的第1种方法,我也推荐大家使用这种方法,简单且无副作用。
这里有一篇坑记 jdbc mysql connector 6 时区问题,关于设置 time_zone
的坑,大家可以看看。
万事俱备,只欠代码
配置完成之后,我们可以写点测试代码了。
本节的代码主要集中在 MSUserService
、MSUserServiceImpl
、MSDBTests
中,其中 MSUserService
是接口,定义了一些数据库操作的方法,如下:
1 | import java.util.List; |
而 MSUserServiceImpl
则是 MSUserService
的实现类, MSDBTests
主要是测试类,用来测试操作 MySQL 数据表的如创建表、查询、删除等操作。大家自行 Clone 代码去看实现即可,我就不在这里占用篇幅贴代码了。
在本节代码中,新增加了两个注解的使用即 @Service
和 @Slf4j
,@Slf4j
这个注解主要用来简化使用日志。而 @Service
注解承担了两个职责一是 Bean 的创建,二是将一个类标识为一个服务。后续我会再深入跟大家分享 @Service
这个注解,目前你只需要用上它就可以了。
在本节的例子中,用到的数据表(user)的数据结构大概如下:
启动 MySQL 服务,然后启动 MSDBTests
中的测试代码,就可以看到实际效果了。
1 |
|
今天就分享到这里,下次结合登录注册例子操作 MySQL 数据库。
做事情,不问能不能做成,要问应不应该做。