MyBatis(数据持久层,❗ “接口 = SQL执行器”)

一、先给结论(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 自动转对象
代码冗余 接口化
相关推荐
骑士雄师3 小时前
java面试题:jvm ,mybatis
java·jvm·mybatis
考虑考虑4 天前
Mybatis实现批量插入
java·后端·mybatis
敲个大西瓜17 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
武子康17 天前
Java-28 深入浅出 Spring 实现简易Ioc-04 在上节的业务下手动实现AOP
java·后端·mybatis
一条泥憨鱼17 天前
苍穹外卖【day6|微信登录与商品浏览功能】
后端·mybatis·苍穹外卖
vx-Biye_Design17 天前
springboot安阳地区研学旅游服务小程序-计算机毕业设计源码12785
java·vue.js·windows·spring boot·tomcat·maven·mybatis
摇滚侠17 天前
MyBatis+Spring+SpringMVC SSM 整合 179-185
java·spring·mybatis
摇滚侠17 天前
MyBatis+Spring+SpringMVC SSM ContextLoaderListener 177-178
java·spring·mybatis