spring boot 连接Mysql介绍
概述
java 应用的数据库接口的层次图如下
JDBC
Java 应用通过 JDBC 接口访问数据库,JDBC(Java DataBase Connectivity/Java 数据库连接)为各种数据库,如 mysql、oracle 等,提供一个统一的接口,应用程序通过 JDBC 执行各种 SQL 操作,如 select、insert 等等。在本文中,我们会通过 JDBC 访问数据库,验证数据库是否正常连接。
JPA
JPA(Java Persistence API/Java 持久层接口),是 ORM(Object Relational Mapping/ 对象关系映射)的一个标准,ORM 的作用是在数据库表与 Java 对象之间建立映射,理论上来说有 ORM 就无需直接通过 SQL 操作数据库了,通过 Java 对象即可,这样会方便很多,Hibernate 是实现 JPA 标准的一个有名例子。JPA 建立在 JDBC 之上,也是通过 JDBC 访问数据库。
Mybatis
ORM 有一些缺点,如过于笨重,比如在多表联合查询时相当繁琐,但直接使用原始的 JDBC 操作数据库过于低效,mybatis 是现在互联网项目使用比较多的一个 Java 持久层库。虽然 mybatis 经常被和 Hibernate 比较,但 mybatis 不是 JPA 的一个实现,mybatis 可以理解为加强版的 SQL,实现了诸如动态 SQL、结果集映射等,高效又不失灵活,个人倾向使用 mybatis。同样的,mybatis 建立在 JDBC 之上,通过 JDBC 访问数据库。后面的教程将对 mybatis 做详细介绍。
准备数据
在这之前,确保已经正确安装 Mysql,推荐目前主流版本 5.7,同时安装官方图形客户端 workbench。
sql 语句
可以在 mysql 命令行客户端直接执行 sql 语句,创建数据库和插入数据
创建数据库
CREATE DATABASE qikegu_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
创建表的 sql 语句:
CREATE TABLE `qikegu_demo`.`user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`nickname` VARCHAR(50) NULL COMMENT '昵称',
`mobile` VARCHAR(20) NULL COMMENT '手机号',
`password` CHAR(60) NULL COMMENT '密码 hash 值',
`role` VARCHAR(100) NULL DEFAULT 'user' COMMENT '角色,角色名以逗号分隔',
PRIMARY KEY (`id`),
UNIQUE INDEX `mobile_UNIQUE` (`mobile` ASC))
COMMENT = '用户表';
插入数据的 sql 语句:
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc1', '13512345678', '123');
INSERT INTO `qikegu_demo`.`user` (`nickname`, `mobile`, `password`) VALUES ('abc2', '13512345677', '123');
使用 workbench 创建数据库和插入数据
打开 workbench,连接进入 mysql 服务器:
创建数据库,在工具栏上点击创建数据库按钮
输入数据库名:qikegu_demo,选择字符排序规则,推荐utf8mb4_unicode_ci
或utf8_general_ci
,点击 apply 下面的 apply 按钮创建。
创建成功后,左侧出现 qikegu_demo 数据库
接下来创建数据表,展开 qikegu_demo 数据库,右键点击 Tables,弹出菜单,选择:Create Tables...
,设置数据表名称和属性,添加字段,注意红圈圈出的地方不要输错,点击 apply 创建数据表
添加数据,左侧展开qikegu_demo -> Tables
,鼠标点击 user 表的编辑按钮
插入用户数据,输入 nickname, mobile, password,不要输入 id,id 由数据库产生,点击 apply 插入数据
创建 spring boot 项目
打开 Eclipse,创建 spring boot 的 spring starter project 项目,在设置依赖配置时,勾选 web, jdbc, mysql,如不清楚怎样创建 spring boot 项目,参照教程: spring boot hello world (restful 接口) 例子
创建成功后,项目目录如下:
pom.xml 由 spring boot 自动生成,注意已经包含了 web, jdbc, mysql 的依赖配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qikegu</groupId>
<artifactId>mysql-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mysql-demo</name>
<description>Demo project for Spring Boot</description>
<span class="hljs-tag"><<span class="hljs-name">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-name">java.version</span>></span>1.8<span class="hljs-tag"></<span class="hljs-name">java.version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-jdbc<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>mysql<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mysql-connector-java<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">scope</span>></span>runtime<span class="hljs-tag"></<span class="hljs-name">scope</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-name">scope</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-name">build</span>></span>
<span class="hljs-tag"><<span class="hljs-name">plugins</span>></span>
<span class="hljs-tag"><<span class="hljs-name">plugin</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-maven-plugin<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-name">plugins</span>></span>
<span class="hljs-tag"></<span class="hljs-name">build</span>></span>
</project>
配置数据源
打开文件:application.properties,该文件在 src -> main -> resources
目录,配置数据库连接:
# 服务器端口,如果不配置默认是 8080 端口
server.port=8096
# 数据库设置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/qikegu_demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=你的数据库密码
解释一下 spring.datasource.url 的配置, 主要下面几个部分:
- localhost - 主机地址
- 3306 - 数据库端口
- qikegu_demo - 数据库名称
问号之后是一些其他的参数设置,如编码、时区设置这些...
spring boot 现在的默认连接池是Hikari,是号称性能最好的连接池,如后续要调优连接池参数,可参考官网文档,现在都使用默认值即可。
访问数据库
添加代码验证数据库是否正常连接,添加文件:HelloController.java
HelloController.java 的代码
package com.qikegu.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
<span class="hljs-meta">@Autowired</span>
JdbcTemplate jdbcTemplate;
<span class="hljs-meta">@RequestMapping(value="/hello", method=RequestMethod.GET)</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">index</span><span class="hljs-params">()</span> {
<span class="hljs-type">String</span> <span class="hljs-variable">sql</span> <span class="hljs-operator">=</span> <span class="hljs-string">"SELECT mobile FROM user WHERE id = ?"</span>;
<span class="hljs-comment">// 通过jdbcTemplate查询数据库</span>
<span class="hljs-type">String</span> <span class="hljs-variable">mobile</span> <span class="hljs-operator">=</span> (String)jdbcTemplate.queryForObject(
sql, <span class="hljs-keyword">new</span> <span class="hljs-title class_">Object</span>[] { <span class="hljs-number">1</span> }, String.class);
<span class="hljs-keyword">return</span> <span class="hljs-string">"Hello "</span> + mobile;
}
}
我们使用 spring 的 JdbcTemplate(这正是我们在前面引入 spring jdbc 依赖的原因),比使用原始的 jdbc 接口方便。
运行
运行程序(如何运行参照: spring boot hello world (restful 接口) 例子),使用浏览器访问,输出从数据库中读取的用户手机号
总结
本文介绍了 spring boot 连接 mysql 的过程,使用 JdbcTemplate 访问数据库,验证数据库连接成功。