第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
前置:第 1 章项目正常启动,/test/hello 接口访问正常
本章目标:引入 mybatis、mysql 驱动,创建数据库表,完成单表查询,打通数据库
2.1 pom.xml 添加依赖
打开 pom.xml,在 <dependencies> 里面追加下面两个依赖,加完之后点右上角 Maven 刷新按钮,拉取 jar 包
<!-- MySQL驱动,SpringBoot3必须用8.x驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- MyBatis整合SpringBoot启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
mybatis-spring-boot-starter 3.0.3 适配 SpringBoot3,不要用 2.x 版本
2.2 Navicat 创建数据库与测试表
-
打开 Navicat,连接 MySQL,新建数据库
数据库名:szyt_db
字符集:utf8mb4,排序规则:utf8mb4_unicode_ci -
在 szyt_db 里面执行下面建表 SQL(新建查询,粘贴运行)
CREATE TABLE
user(
idBIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
usernameVARCHAR(50) NOT NULL COMMENT '用户名',
passwordVARCHAR(100) NOT NULL COMMENT '密码',
nicknameVARCHAR(50) DEFAULT NULL COMMENT '昵称',
ageINT DEFAULT NULL COMMENT '年龄',
create_timeDATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_timeDATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入一条测试数据
INSERT INTOuser(username,password,nickname,age) VALUES ('zzs','123456','小张',22);
执行成功后,打开 user 表,可以看到这条测试数据。
2.3 修改 application.yml,配置数据库 + MyBatis
# 基础服务配置
server:
port: 8080
spring:
application:
name: szyt
# mysql数据源配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/szyt_db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: 你的mysqlroot密码 # 这里改成你自己MySQL的root密码!
# MyBatis配置
mybatis:
# mapper xml文件存放位置
mapper-locations: classpath:mapper/*.xml
# 实体类别名包,后面xml里可以直接写类名不用写全限定名
type-aliases-package: com.zzs.szyt.entity
configuration:
map-underscore-to-camel-case: true # 开启下划线转驼峰:create_time → createTime
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql日志,开发调试神器
⚠️ 重点修改:password 换成你自己的 MySQL 密码,否则启动报错连不上数据库
2.4 创建分层包结构(标准后端分层)
在 com.zzs.szyt 下新建这几个包:
entity:实体类(对应数据库表)mapper:MyBatis Mapper 接口service:业务接口service.impl:业务实现类controller:接口层(之前已经有了)
最终包结构:
com.zzs.szyt
├── SzytApplication.java
├── controller
├── entity
├── mapper
├── service
└── service.impl
2.4.1 实体类 User.java(entity 包)
package com.zzs.szyt.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data // lombok自动生成get set toString
public class User {
private Long id;
private String username;
private String password;
private String nickname;
private Integer age;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
2.4.2 Mapper 接口 UserMapper.java(mapper 包)
package com.zzs.szyt.mapper;
import com.zzs.szyt.entity.User;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
// 根据id查询用户
User selectById(@Param("id") Long id);
}
2.4.3 Mapper XML 文件
在 resources 目录下新建文件夹 mapper,新建 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zzs.szyt.mapper.UserMapper">
<select id="selectById" resultType="User">
select id,username,password,nickname,age,create_time,update_time
from user
where id = #{id}
</select>
</mapper>
namespace 必须和 Mapper 接口全类名一致;id 和接口方法名一致
2.5 给启动类加上 Mapper 扫描注解
打开 SzytApplication.java,添加 @MapperScan("com.zzs.szyt.mapper")
package com.zzs.szyt;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.zzs.szyt.mapper") // 扫描mapper包,自动生成代理对象
public class SzytApplication {
public static void main(String[] args) {
SpringApplication.run(SzytApplication.class, args);
}
}
2.6 写 Service 层
UserService.java(service 包)
package com.zzs.szyt.service;
import com.zzs.szyt.entity.User;
public interface UserService {
User getUserById(Long id);
}
UserServiceImpl.java(service.impl 包)
package com.zzs.szyt.service.impl;
import com.zzs.szyt.entity.User;
import com.zzs.szyt.mapper.UserMapper;
import com.zzs.szyt.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
2.7 写 UserController,提供查询接口(controller 包)
package com.zzs.szyt.controller;
import com.zzs.szyt.entity.User;
import com.zzs.szyt.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@GetMapping("/getById")
public User getById(@RequestParam Long id){
return userService.getUserById(id);
}
}
✅ 本章测试步骤
- 重启项目,观察控制台:没有数据库连接报错、MyBatis 正常加载
- Postman / 浏览器 GET 请求:
http://localhost:8080/user/getById?id=1 - 预期返回 JSON(就是我们刚才插入的那条用户数据)
同时控制台会打印出执行的 SQL 语句(yml 里面开启了 mybatis 日志)
验收标准
- 启动无报错
- 接口可以正常返回用户 json 数据
- 控制台打印执行的 SQL
👉 测试完成,没问题回复:没问题,继续下一节
报错直接贴控制台异常信息给我排查修复。
报错:java.io.UnsupportedEncodingException: utf8mb4
java.io.UnsupportedEncodingException: utf8mb4
新版 mysql-connector-j(9.x)不支持在 url 里直接写
utf8mb4作为characterEncoding的值 !旧写法在新版本驱动里直接抛编码异常。
修复方案:修改 application.yml 里的 spring.datasource.url
原来错误 url:
url: jdbc:mysql://localhost:3306/szyt_db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai&allowMultiQueries=true
✅ 修改成下面正确的(characterEncoding 改为 utf-8,utf8mb4 交给 mysql 服务器侧)
url: jdbc:mysql://127.0.0.1:3306/szyt_db?serverTimezone=Asia/Shanghai&allowMultiQueries=true
原理:
mysql 驱动的
characterEncoding参数合法值只有utf-8,utf8mb4是 MySQL 数据库的字符集,数据库我们已经建表指定utf8mb4,驱动层面不需要填 utf8mb4。
