一、先给结论(MyBatis 是什么)
❗ MyBatis = Java 方法 ↔ SQL 的映射框架
核心------❗ "接口 = SQL执行器"
二、你现在的问题(没有 MyBatis 之前)
你现在如果要查用户:
JDBC写法:
1. 获取连接
2. 写SQL
3. 执行
4. 解析结果
代码非常繁琐。
三、MyBatis 做了什么?
它帮你做三件事:
1. 管理 SQL
2. 把 SQL 映射成 Java 方法
3. 自动把结果转成对象
五、最小MyBatis结构
在 Spring Boot 中:
Controller
↓
Service
↓
Mapper(MyBatis)
↓
SQL
↓
MySQL
六、开始接入 MyBatis(一步一步)
Step 1:添加依赖(minishop-user)
在:minishop-user/pom.xml
加入:
XML
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
Step 2:配置数据库连接
在:
src/main/resources/application.yml
创建:
XML
spring:
datasource:
url: jdbc:mysql://localhost:3306/minishop?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
Step 3:创建数据库表(用户表)
sql# 登录 000000 MySQL mysql -u root -p # 创建数据库 CREATE DATABASE minishop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 退出 exit; #Mac禁用了 mysql_native_password # 方案1------行不通,密码没错 ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的密码'; FLUSH PRIVILEGES; #方案 2(企业推荐):新建开发用户(最稳定) #避免 root 认证问题: CREATE USER 'dev'@'localhost' IDENTIFIED BY 'dev123'; GRANT ALL PRIVILEGES ON minishop.* TO 'dev'@'localhost'; FLUSH PRIVILEGES;
sql
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(100)
);
Step 4:创建实体(domain)
com.minishop.user.domain
java
package com.minishop.user.domain;
public class User {
private Long id;
private String username;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Step 5:创建 Mapper(核心)
com.minishop.user.mapper
java
package com.minishop.user.mapper;
import com.minishop.user.domain.User;
import org.apache.ibatis.annotations.*;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO user(username,password) VALUES(#{username},#{password})")
void insert(User user);
}
Step 6:Service 调用 Mapper
java
package com.minishop.user.service;
import com.minishop.user.domain.User;
import com.minishop.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUser(Long id) {
return userMapper.selectById(id);
}
}
Step 7:Controller 调用 Service
java
package com.minishop.user.controller;
import com.minishop.common.result.Result;
import com.minishop.user.domain.User;
import com.minishop.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public Result<User> getUser(@PathVariable Long id) {
return Result.success(userService.getUser(id));
}
}
七、MyBatis 本质(非常重要)
1️⃣ Mapper 是什么?
接口 ≠ 普通接口
👉 MyBatis 会帮你生成实现类:
UserMapperProxy(动态代理)
2️⃣ SQL在哪里执行?
Mapper方法 → SQL → JDBC → MySQL
3️⃣ 为什么不用写实现类?
因为:
MyBatis 用动态代理自动生成
八、MyBatis 执行流程(核心链路)
UserMapper.selectById()
↓
MapperProxy(代理)
↓
SQL解析
↓
JDBC执行
↓
ResultSet
↓
对象映射(User)
九、MyBatis vs JDBC(本质区别)
| JDBC | MyBatis |
|---|---|
| 手写SQL流程 | 自动映射 |
| 手动解析ResultSet | 自动转对象 |
| 代码冗余 | 接口化 |