第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询

第 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 版本

  1. 打开 Navicat,连接 MySQL,新建数据库
    数据库名:szyt_db
    字符集:utf8mb4,排序规则:utf8mb4_unicode_ci

  2. 在 szyt_db 里面执行下面建表 SQL(新建查询,粘贴运行)

    CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键id',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    password VARCHAR(100) NOT NULL COMMENT '密码',
    nickname VARCHAR(50) DEFAULT NULL COMMENT '昵称',
    age INT DEFAULT NULL COMMENT '年龄',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    -- 插入一条测试数据
    INSERT INTO user(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);
    }
}

✅ 本章测试步骤

  1. 重启项目,观察控制台:没有数据库连接报错、MyBatis 正常加载
  2. Postman / 浏览器 GET 请求:
    http://localhost:8080/user/getById?id=1
  3. 预期返回 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。

相关推荐
实泽有之,无泽虚之1 小时前
SQL Server数据库备份与还原详解
数据库·sqlserver
DevOpenClub1 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考
Java后端的Ai之路1 小时前
Java并发编程07-等待通知机制优化循环等待
java·数据库·python
AllData公司负责人1 小时前
AllData 可定义数据中台完成信创适配|银河麒麟 + 海光X86 CPU / 华为鲲鹏ARM CPU+ OceanBase / 人大金仓国产化环境部署落地
大数据·arm开发·数据库·人工智能·oceanbase·kingbase
bksczm1 小时前
C++Redis开发(Ubuntu 22.04)
数据库·redis·缓存
zhangjw341 小时前
1-6 PostgreSQL 特色类型实战:数组、JSON & JSONB、枚举、范围类型
数据库·postgresql
杨云龙UP2 小时前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle
余槐i2 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化
倔强的石头_2 小时前
MongoDB迁移的新选项:在金仓KES上,用SQL管理文档数据
数据库