发布于 

微服务: 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-pythonmysql-connector-cmysql-connector-ODBCmysql-connector-jdbc 等,如下图(来自 MySQL Connectors 官网):

1568529858131

可以使用下面的图简单描述一下JDBC和数据连接的示意图,如下图:

1568529858131

一图胜千言,Java 应用程序可以通过 JDBC 和数据库驱动程序连接、访问、操作数据库(MySQL、Oracle等)。

配置 pom 文件

我还是用 Github 代码仓库的例子,大家可以自行 Clone 代码。

打开工程的 pom.xml 文件,增加 mysql-connector-javaspring-boot-starter-jdbc 依赖,从上面内容大家应该可以理解为什么要加入这两项了吧!

1
2
3
4
5
6
7
8
9
10
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

等待 Maven 下载完成这两项依赖。

配置 properties

打开 application-dev.properties 文件,增加如下内容:

1
2
3
4
5
6
7
8
9
10
11
# jdbc
# spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# JDBC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接的数据库
# spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
# 数据库用户名
spring.datasource.username=root
# 数据库密码
spring.datasource.password=pwd123

其中 mzc_user 是我创建的数据库文件名称,大家要根据自己的实际情况做相关的修改。配置 properties 注意以下几个问题。

1、spring.datasource.driver-class-name 的配置

如果配置值为 com.mysql.jdbc.Driver,会报下面的警告:

1
2
3
Loading class `com.mysql.jdbc.Driver'. This is deprecated. 
The new driver class is `com.mysql.cj.jdbc.Driver'.
The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

意思是这个类已经过时了,请使用最新的 jdbc.driver 修改数据源配置,如下:

1
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2、spring.datasource.url 的配置

关于这个url 的配置,官方有更加详细的配置说明,可以参考 Connection URL SyntaxConfiguration Properties 两篇文档。

如果配置为 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user,会一直报如下错误:

1
2
The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. 
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

解决这个问题,有如下3种解决方案。

1、指定时区

1
2
// 北京时间东八区
serverTimezone=GMT%2B8

注意,%2B+ 的编码格式。
如果你设置 serverTimezone=UTC,连接不报错, 但在用java代码插入到数据库时间的时候却出现了问题。

比如在 Java 代码里面插入的时间为 2018-06-24 17:29:56,但是在数据库里面显示的时间却为 2018-06-24 09:29:56,这样就有了8个小时的时差。UTC 代表的是全球标准时间 ,而我们使用的时间是北京时区也就是东八区,领先 UTC 八个小时。

1
2
3
4
5
// 京时间东八区
serverTimezone=GMT%2B8

// 或者使用上海时间
serverTimezone=Asia/Shanghai

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
2
3
4
5
6
7
8
9
[mysqld]

# Set default time-zone
default-time-zone='+08:00'

# The TCP/IP Port the MySQL Server will listen on
port=3306

# ...

修改配置文件之后,重启MySQL服务就可以了。

3、修改数据库, 配置全局时区

切换到名称为 mysql 的数据库,然后执行下面的语句:

1
2
3
4
show variables like '%time_zone%';

# 设置全局时区,即时生效,作用于所有session
set global time_zone='+8:00';

1568529858131

设置完成后,可以使用 show variables like '%time_zone%'; 看看是否修改成功。

你也可以执行,但是只能对当前的 session 生效,示例如下:

1
2
# 设置当前session时区,即时生效,但仅作用于当前session
set time_zone='+8:00';

我个人使用的是上述中的第1种方法,我也推荐大家使用这种方法,简单且无副作用。

这里有一篇坑记 jdbc mysql connector 6 时区问题,关于设置 time_zone 的坑,大家可以看看。

万事俱备,只欠代码

配置完成之后,我们可以写点测试代码了。

本节的代码主要集中在 MSUserServiceMSUserServiceImplMSDBTests 中,其中 MSUserService 是接口,定义了一些数据库操作的方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.List;
import java.util.Map;

public interface MSUserService {

int createUser(MSUser user);

int deleteByUid(Integer uid);

List<Map> queryUserByUid(Integer uid);

List<Map> queryUserByUserName(String userName);

int deleteUserTable();
}

MSUserServiceImpl 则是 MSUserService 的实现类, MSDBTests 主要是测试类,用来测试操作 MySQL 数据表的如创建表、查询、删除等操作。大家自行 Clone 代码去看实现即可,我就不在这里占用篇幅贴代码了。

在本节代码中,新增加了两个注解的使用即 @Service@Slf4j@Slf4j 这个注解主要用来简化使用日志。而 @Service 注解承担了两个职责一是 Bean 的创建,二是将一个类标识为一个服务。后续我会再深入跟大家分享 @Service 这个注解,目前你只需要用上它就可以了。

在本节的例子中,用到的数据表(user)的数据结构大概如下:

1568529858131

启动 MySQL 服务,然后启动 MSDBTests 中的测试代码,就可以看到实际效果了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Test
public void createUserSQLTest() {
MSUser user = new MSUser();
user.setUserID(1);
user.setAccountName("mzc");
user.setAccountPwd("123");
user.setNickName("veryitman");
user.setMotto("foo");
user.setAge(25);
user.setGender(MSUser.GENDER_MALE);
user.setPhone("17122036530");

// 增加user数据
msUserService.createUser(user);
}

@Test
public void queryUserBySQLTest() {
// 根据user_id查询
List<Map> userJson = msUserService.queryUserByUid(1);
logger.info("MSBlog Test, userJson by query user's id: " + userJson.get(0));

// 根据user_name查询
userJson = msUserService.queryUserByUserName("mzc");
logger.info("MSBlog Test, userJson by query user's name: " + userJson.get(0));
}

今天就分享到这里,下次结合登录注册例子操作 MySQL 数据库。


做事情,不问能不能做成,要问应不应该做。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman