[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Starter | n. | /ˈstɑːtə(r)/ | 启动器(Spring Boot 预配置的依赖集合,mybatis-plus-spring-boot3-starter 导入后自动完成 MP 与 Spring Boot 的整合) |
| Mapper | n. | /ˈmæpə(r)/ | 映射器(Mapper 接口负责声明数据访问方法,MyBatis-Plus 中继承 BaseMapper 即可获得全部单表方法) |
| Configuration | n. | /kənˌfɪɡəˈreɪʃn/ | 配置(application.properties 中通过配置项控制框架行为) |
| Log | n. | /lɒɡ/ | 日志(配置日志输出后,控制台会打印框架自动生成的 SQL,方便我们观察) |
Lecture02-快速入门-环境搭建与第一个查询
一、功能目标
搭建一个 Spring Boot 工程,集成 MyBatis-Plus,查询 t_emp 表中的全部员工数据,并在控制台打印。
二、准备工作
执行下面的建表语句:
如果上一阶段 JdbcTemplate 课程的
t_emp表已经存在,可以跳过建表,直接执行「插入测试数据」。
-- 创建员工表
CREATE TABLE t_emp (
emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID,主键,自增',
emp_no VARCHAR(20) NOT NULL COMMENT '员工编号',
emp_name VARCHAR(50) NOT NULL COMMENT '员工姓名',
emp_salary DECIMAL(10,2) COMMENT '员工工资',
emp_birthday DATE COMMENT '出生日期',
phone_num VARCHAR(20) COMMENT '手机号',
dept_id INT COMMENT '部门ID'
) COMMENT '员工表';
插入测试数据:
INSERT INTO t_emp (emp_no, emp_name, emp_salary, emp_birthday, phone_num, dept_id) VALUES
('No.10001', '张三', 8000.00, '2000-01-15', '13511110001', 1),
('No.10002', '李四', 12000.00, '1998-05-20', '13511110002', 1),
('No.10003', '王五', 6000.00, '2002-09-08', '13511110003', 2),
('No.10004', '赵六', 15000.00, '1995-11-30', '13511110004', 2);
三、创建工程
1、创建普通 Maven module
和之前 Spring 课程的工程创建方式一样:在 IDEA 中创建普通 Maven 模块,命名如 module-mp-demo。
2、配置 pom.xml
①继承 Spring Boot 父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.12</version>
<relativePath/>
</parent>
②导入依赖
<dependencies>
<!-- MyBatis-Plus 整合 Spring Boot 3 的启动器(核心依赖) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.17</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- Lombok:简化实体类代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 测试环境 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
版本说明:Spring Boot 3.x 必须使用
mybatis-plus-spring-boot3-starter(3.5.x 系列);Spring Boot 2.x 才用mybatis-plus-boot-starter,不要搞混。
3、创建主启动类
package com.atguigu.mp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ModuleMpApplication {
public static void main(String[] args) {
SpringApplication.run(ModuleMpApplication.class, args);
}
}
4、配置 application.properties
# 应用名称
spring.application.name=module-mp-demo
# ===== 数据源配置(连接信息与 JdbcTemplate 课程一致)=====
spring.datasource.username=atguigu
spring.datasource.password=atguigu
spring.datasource.url=jdbc:mysql://192.168.100.100/db_hr
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# ===== MyBatis-Plus 配置 =====
# 把框架自动生成的 SQL 打印到控制台,方便我们观察学习
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
log-impl是学习阶段必须开启的配置:每个方法调用后,控制台都会打印它自动生成的 SQL,我们能直观看到「一行代码背后发生了什么」。
四、编写代码
1、创建实体类 Employee
实体类与表 t_emp 对应,一个对象对应表中一行数据。
package com.atguigu.mp.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("t_emp") // 指定实体类对应的数据库表名
public class Employee {
@TableId(type = IdType.AUTO) // 主键,数据库自增
private Integer empId;
private String empNo;
private String empName;
private BigDecimal empSalary;
private Date empBirthday;
private String phoneNum;
private Integer deptId;
}
字段映射规则(本教程默认规则,第 3 章详解):
- 类名
Employee→ 表名:通过@TableName("t_emp")显式指定 - 属性
empId→ 列名emp_id:驼峰命名自动转下划线,框架自动完成
2、创建 Mapper 接口
package com.atguigu.mp.mapper;
import com.atguigu.mp.entity.Employee;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper // 交给 MyBatis-Plus 扫描,放入 IoC 容器
public interface EmployeeMapper extends BaseMapper<Employee> {
// 什么都不用写!继承 BaseMapper 后,单表增删改查方法全部可用
}
BaseMapper<Employee>泛型指定操作哪张表对应的实体- 接口中不用写任何方法,单表增删改查方法由框架提供(第 4 章详细讲解)
- 注意:由于我们需要让 Mybatis 来负责创建 Mapper 接口的实现类对象并把它放入 IoC 容器,所以必须使用 Mybatis 提供的 @Mapper;此时就不能使用 @Repository 了。
3、编写测试类
创建测试类,位置要求:src/test/java 下,主启动类所在包或子包。
package com.atguigu.mp;
import com.atguigu.mp.entity.Employee;
import com.atguigu.mp.mapper.EmployeeMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class EmployeeMapperTest {
@Autowired
private EmployeeMapper employeeMapper;
@Test
public void testSelectList() {
// 查询全部员工:参数 null 表示不带任何查询条件
List<Employee> employeeList = employeeMapper.selectList(null);
for (Employee employee : employeeList) {
System.out.println("employee = " + employee);
}
}
}
五、运行测试
运行 testSelectList 测试方法,观察控制台输出:
1、MyBatis-Plus 自动生成的 SQL
==> Preparing: SELECT emp_id,emp_no,emp_name,emp_salary,emp_birthday,phone_num,dept_id FROM t_emp
==> Parameters:
<== Columns: emp_id, emp_no, emp_name, emp_salary, emp_birthday, phone_num, dept_id
<== Row: 1, No.10001, 张三, 8000.00, 2000-01-15, 13511110001, 1
<== Row: 2, No.10002, 李四, 12000.00, 1998-05-20, 13511110002, 1
<== Row: 3, No.10003, 王五, 6000.00, 2002-09-08, 13511110003, 2
<== Row: 4, No.10004, 赵六, 15000.00, 1995-11-30, 13511110004, 2
<== Total: 4
2、程序打印的结果
employee = Employee(empId=1, empNo=No.10001, empName=张三, empSalary=8000.00, empBirthday=2000-01-15, phoneNum=13511110001, deptId=1)
employee = Employee(empId=2, empNo=No.10002, empName=李四, empSalary=12000.00, empBirthday=1998-05-20, phoneNum=13511110002, deptId=1)
employee = Employee(empId=3, empNo=No.10003, empName=王五, empSalary=6000.00, empBirthday=2002-09-08, phoneNum=13511110003, deptId=2)
employee = Employee(empId=4, empNo=No.10004, empName=赵六, empSalary=15000.00, empBirthday=1995-11-30, phoneNum=13511110004, deptId=2)
观察要点:
SELECT语句的列名是框架根据实体属性自动生成的:empId→emp_id- 查询结果的列又自动封装回了实体对象的属性
- 我们只写了
employeeMapper.selectList(null)一行代码
六、图解:一次查询的完整流程
流程说明:
- 测试类调用
employeeMapper.selectList(null) - EmployeeMapper 是继承 BaseMapper 的接口,方法由框架动态实现
- MyBatis-Plus 根据实体类字段和注解自动生成 SQL
- 通过 JDBC 驱动连接数据库执行 SQL(连接信息来自 application.properties)
- 数据库返回结果集,框架把每一行封装成 Employee 对象,汇总成
List<Employee>返回
七、常见问题
| 问题 | 原因与解决 |
|---|---|
启动报错 Invalid value of statement / factoryBeanObjectType | mybatis-plus-spring-boot3-starter 版本过低,升级到 3.5.9+(本教程 3.5.17) |
查询报 Table 'db_hr.employee' doesn't exist | 实体类没有加 @TableName("t_emp"),框架默认按类名找表 |
| 控制台不打印 SQL | 检查 mybatis-plus.configuration.log-impl 配置是否写对 |
| 连不上数据库 | 检查 url / 用户名 / 密码是否与课程环境一致 |
@Mapper 注解报红 | 确认已导入 mybatis-plus-spring-boot3-starter 依赖 |
八、本章小结
- 集成步骤:导入依赖 → 配置数据源 → 创建实体类 → 创建 Mapper 接口
- 实体类用
@TableName指定表名,属性驼峰自动映射列名 - Mapper 接口继承
BaseMapper<T>,方法开箱即用 - 开启
log-impl配置,可以在控制台看到框架自动生成的 SQL
下一章我们学习实体类与表的映射规则、常用注解。