本篇是微服务系列 的第 N 篇,从本篇开始我们就要接触和学习数据库相关的知识了。
数据库我们就选 MySQL 数据库,免费且资料多,大部分公司都会使用该数据库。我是在 Windows 10
上面搭建的微服务开发环境,同理,MySQL 数据库也是在这个系统上面安装的并且使用的是 MySQL8.0 版本,如果你还没有安装或者在安装 MySQL8.0 遇到问题可以参考 MySQL8.0.15在Win10上的折腾记 这篇文章。
今天主要跟大家分享如何使用 SpringBoot 结合 JDBC 连接和操作 MySQL 数据库,主要还是以实例为主。
在说实例之前,带大家先了解一下标题中几个名词的概念。
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
是 JDBC 的一个实现 ,用它可以连接 MySQL 系统。
同理,还有 mysql-connector-python
、 mysql-connector-c
、 mysql-connector-ODBC
、 mysql-connector-jdbc
等,如下图(来自 MySQL Connectors 官网):
可以使用下面的图简单描述一下JDBC和数据连接的示意图,如下图:
一图胜千言,Java 应用程序可以通过 JDBC 和数据库驱动程序连接、访问、操作数据库(MySQL、Oracle等)。
我还是用 Github 代码仓库的例子,大家可以自行 Clone 代码。
打开工程的 pom.xml
文件,增加 mysql-connector-java
和 spring-boot-starter-jdbc
依赖,从上面内容大家应该可以理解为什么要加入这两项了吧!
<!--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 下载完成这两项依赖。
打开 application-dev.properties
文件,增加如下内容:
# 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 注意以下几个问题。
如果配置值为 com.mysql.jdbc.Driver
,会报下面的警告:
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
修改数据源配置,如下:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
如果配置为 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mzc_user
,会一直报如下错误:
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种解决方案。
// 北京时间东八区 serverTimezone=GMT%2B8
注意, %2B
是 +
的编码格式。
如果你设置 serverTimezone=UTC
,连接不报错, 但在用java代码插入到数据库时间的时候却出现了问题。
比如在 Java 代码里面插入的时间为 2018-06-24 17:29:56
,但是在数据库里面显示的时间却为 2018-06-24 09:29:56
,这样就有了8个小时的时差。UTC 代表的是全球标准时间 ,而我们使用的时间是北京时区也就是东八区,领先 UTC 八个小时。
// 京时间东八区 serverTimezone=GMT%2B8 // 或者使用上海时间 serverTimezone=Asia/Shanghai
我在 Windows 10
找到 MySQL 配置文件 my.ini
,如果你没有找到可以参考 MySQL8.0.15在Win10上的折腾记 这篇文章,非 Windows
系统可能配置文件时 my.cnf
。
在配置文件中,增加默认时区配置:
default-time-zone='+08:00'
在 my.ini
或者 my.cnf
文件的 [mysqld]
下面增加上面配置,示例如下:
[mysqld] # Set default time-zone default-time-zone='+08:00' # The TCP/IP Port the MySQL Server will listen on port=3306 # ...
修改配置文件之后,重启MySQL服务就可以了。
切换到名称为 mysql
的数据库,然后执行下面的语句:
show variables like '%time_zone%'; # 设置全局时区,即时生效,作用于所有session set global time_zone='+8:00';
设置完成后,可以使用 show variables like '%time_zone%';
看看是否修改成功。
你也可以执行,但是只能对当前的 session 生效,示例如下:
# 设置当前session时区,即时生效,但仅作用于当前session set time_zone='+8:00';
我个人使用的是上述中的第 1 种方法,我也推荐大家使用这种方法,简单且无副作用。
配置完成之后,我们可以写点测试代码了。
本节的代码主要集中在 MSUserService
、 MSUserServiceImpl
、 MSDBTests
中,大家自行 Clone 代码去看即可,我就不再占用篇幅贴代码了。其中 MSDBTests
主要是测试类,用来测试操作 MySQL 数据表的如创建表、查询、删除等操作。
在本节代码中,新增加了两个注解的使用即 @Service
和 @Slf4j
, @Slf4j
这个注解主要用来简化使用日志。而 @Service
注解承担了两个职责一是 Bean 的创建,二是将一个类标识为一个服务。后续我会再深入跟大家分享 @Service
这个注解,目前你只需要用上它就可以了。
在本节的例子中,用到的数据表(user)的数据结构大概如下:
启动 MySQL 服务,然后启动 MSDBTests
中的测试代码,就可以看到实际效果了。
@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 数据库。